/** * 计算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 }