-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathcrc.js
More file actions
52 lines (46 loc) · 1.93 KB
/
Copy pathcrc.js
File metadata and controls
52 lines (46 loc) · 1.93 KB
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
42
43
44
45
46
47
48
49
50
51
52
import { assertU8 } from './fallback/_utils.js'
import { crc32Table } from './fallback/crc.js'
import { isHermes, isLE } from './fallback/platform.js'
const T = crc32Table()
const [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ta, Tb, Tc, Td, Te, Tf] = Array.from(
{ length: 16 },
(_, k) => T.subarray(k * 256, k * 256 + 256)
)
export function crc32(x) {
assertU8(x)
let c = -1
let i = 0
const n = x.length
if (isLE && n > 1024) {
const pre = (4 - (x.byteOffset & 3)) & 3
for (; i < pre; i++) c = T0[(c ^ x[i]) & 0xff] ^ (c >>> 8)
const words = (n - i) >>> 2
const W = new (isHermes ? Uint32Array : Int32Array)(x.buffer, x.byteOffset + i, words)
let j = 0
for (const end = words - 3; j < end; j += 4) {
const a = W[j] ^ c
const b = W[j + 1]
const d = W[j + 2]
const e = W[j + 3]
// prettier-ignore
c =
T[0xf_00 + (a & 0xff)] ^ T[0xe_00 + ((a >>> 8) & 0xff)] ^ T[0xd_00 + ((a >>> 16) & 0xff)] ^ T[0xc_00 + (a >>> 24)] ^
T[0xb_00 + (b & 0xff)] ^ T[0xa_00 + ((b >>> 8) & 0xff)] ^ T[0x9_00 + ((b >>> 16) & 0xff)] ^ T[0x8_00 + (b >>> 24)] ^
T[0x7_00 + (d & 0xff)] ^ T[0x6_00 + ((d >>> 8) & 0xff)] ^ T[0x5_00 + ((d >>> 16) & 0xff)] ^ T[0x4_00 + (d >>> 24)] ^
T[0x3_00 + (e & 0xff)] ^ T[0x2_00 + ((e >>> 8) & 0xff)] ^ T[0x1_00 + ((e >>> 16) & 0xff)] ^ T[e >>> 24]
}
i += j * 4 // not << 2, so that inputs >= 2 GiB stay correct
} else {
for (const end = n - 15; i < end; i += 16) {
// prettier-ignore
c =
Tf[(x[i] ^ c) & 0xff] ^ Te[(x[i + 1] ^ (c >>> 8)) & 0xff] ^
Td[(x[i + 2] ^ (c >>> 16)) & 0xff] ^ Tc[x[i + 3] ^ (c >>> 24)] ^
Tb[x[i + 4]] ^ Ta[x[i + 5]] ^ T9[x[i + 6]] ^ T8[x[i + 7]] ^
T7[x[i + 8]] ^ T6[x[i + 9]] ^ T5[x[i + 10]] ^ T4[x[i + 11]] ^
T3[x[i + 12]] ^ T2[x[i + 13]] ^ T1[x[i + 14]] ^ T0[x[i + 15]]
}
}
for (let k = i; k < n; k++) c = T0[(c ^ x[k]) & 0xff] ^ (c >>> 8)
return ~c >>> 0
}