|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
} |