@hqtsm/crc
Version:
CRC functions with a parameterized engine optimized for both speed and size
122 lines • 3.83 kB
JavaScript
/**
* @module
*
* The core CRC functions and types.
*/
/**
* CRC factory.
*
* @template T Number type.
* @param size Bit size.
* @param poly Polynomial.
* @param refi Reflect input.
* @param xori XOR input.
* @param refo Reflect output.
* @param xoro XOR output.
* @returns CRC interface.
*/
export function crc(size, poly, refi, xori, refo, xoro) {
let t;
let s;
let i8 = size - size;
let i0 = i8++;
let i1 = i8++;
let i255 = (i1 << (i8 <<= i8)) - i1;
let h = i1 << size - i1;
let m = h - i1 << i1 | i1;
let n = i0 === 0;
let reflect = (data, width) => {
let r = data & i1;
while (--width) {
r = r << i1 | (data >>= i1) & i1;
}
return (n ? r >>> 0 : r);
};
let table = () => {
let r = size < i8 ? i8 - size : i0;
let l = size - i8 + r;
let a = h << r;
let x = poly << r;
let t = [i0];
let c;
for (let i = i255; i;) {
c = (refi ? reflect(i, 8) : i) << l;
for (let j = 8; j--;) {
c = c & a ? c << i1 ^ x : c << i1;
}
c >>= r;
c = refi ? reflect(c, size) : (c & m);
t[i--] = n ? c >>> 0 : c;
}
return t;
};
return {
size,
poly,
refi,
xori,
refo,
xoro,
reflect,
table,
init: refi ? () => reflect(xori, size) : () => xori,
update: refi
? (n
? (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[(crc ^ data[i++]) & i255] ^ crc >>> i8);
}
return crc >>> 0;
}
: (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[Number(crc & i255) ^
data[i++] & 255] ^ crc >> i8);
}
return crc;
})
: ((s = size - i8) > 0
? (n
? (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[(crc >>> s ^ data[i++]) & i255] ^ crc << i8 & m);
}
return crc >>> 0;
}
: (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[Number(crc >> s & i255) ^
data[i++] & 255] ^ crc << i8 & m);
}
return crc;
})
: ((s = -s, n)
? (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[(crc << s ^ data[i++]) & i255]);
}
return crc;
}
: (crc, data) => {
t ??= table();
for (let i = 0, l = data.length; i < l;) {
crc = (t[Number(crc << s & i255) ^
data[i++] & 255]);
}
return crc;
})),
finalize: refo === refi
? (n
? (crc) => (crc ^ xoro) >>> 0
: (crc) => (crc ^ xoro))
: (n
? (crc) => (reflect(crc, size) ^ xoro) >>> 0
: (crc) => (reflect(crc, size) ^ xoro)),
};
}
//# sourceMappingURL=crc.js.map