test / crc32.js
asdass1's picture
Create crc32.js
482498d verified
/**
* 计算CRC32
* @param {ArrayBuffer} buffer - ArrayBuffer
*/
export default buffer => {
buffer = new Uint8Array(buffer)
const module = {
polynom: 0xEDB88320,
initValue: -1,
bytes: 4,
table: []
}
for (let a = 0; a < 256; ++a) {
let b = a
for (let c = 0; c < 8; ++c) {
b = b & 1 ? module.polynom ^ (b >>> 1) : b >>> 1
}
module.table[a] = b >>> 0
}
let crc = module.initValue
let length = buffer.length
let table = module.table
for (let a = 0; a < 256; ++a) {
let b = a
for (let c = 0; c < 8; ++c) {
b = b & 1 ? module.polynom ^ (b >>> 1) : b >>> 1
}
module.table[a] = b >>> 0
}
for (let i = 0; i < length; ++i) {
crc = table[(crc ^ buffer[i]) & 0xFF] ^ (crc >>> 8)
}
crc ^= module.initValue
let HEX_CHARS = '0123456789abcdef'.split('');
let hex = '';
if (module.bytes > 2) {
hex += HEX_CHARS[(crc >> 28) & 0x0F] + HEX_CHARS[(crc >> 24) & 0x0F] + HEX_CHARS[(crc >> 20) & 0x0F] + HEX_CHARS[(crc >> 16) & 0x0F]
}
hex += HEX_CHARS[(crc >> 12) & 0x0F] + HEX_CHARS[(crc >> 8) & 0x0F] + HEX_CHARS[(crc >> 4) & 0x0F] + HEX_CHARS[crc & 0x0F]
return hex
}