File size: 1,156 Bytes
482498d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 * 计算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
}