js实现crc
CRC 实现方法(JavaScript)
CRC(Cyclic Redundancy Check)是一种常用的数据校验算法,以下提供几种 JavaScript 实现方式:
使用预计算表(查表法)
查表法是 CRC 计算的高效方式,适合处理大量数据:
function makeCRCTable() {
const crcTable = [];
for (let n = 0; n < 256; n++) {
let c = n;
for (let k = 0; k < 8; k++) {
c = c & 1 ? 0xEDB88320 ^ (c >>> 1) : c >>> 1;
}
crcTable[n] = c;
}
return crcTable;
}
function crc32(str) {
const crcTable = makeCRCTable();
let crc = 0xFFFFFFFF;
for (let i = 0; i < str.length; i++) {
const byte = str.charCodeAt(i);
crc = (crc >>> 8) ^ crcTable[(crc ^ byte) & 0xFF];
}
return (crc ^ 0xFFFFFFFF) >>> 0;
}
直接计算法(适用于小数据量)
不需要预计算表的简单实现:
function crc16(data) {
let crc = 0xFFFF;
for (let i = 0; i < data.length; i++) {
crc ^= data.charCodeAt(i) << 8;
for (let j = 0; j < 8; j++) {
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
}
return crc & 0xFFFF;
}
不同多项式配置
CRC 算法的核心区别在于多项式选择,常见配置:
- CRC-8:多项式 0x07
- CRC-16-CCITT:多项式 0x1021
- CRC-32:多项式 0xEDB88320
修改多项式值即可实现不同标准:
// CRC-8 示例
function crc8(data) {
let crc = 0;
const poly = 0x07;
for (const byte of data) {
crc ^= byte;
for (let i = 0; i < 8; i++) {
crc = crc & 0x80 ? (crc << 1) ^ poly : crc << 1;
}
}
return crc & 0xFF;
}
二进制数据处理
处理 ArrayBuffer 或 Uint8Array 数据:

function crc32Buffer(buffer) {
const view = new Uint8Array(buffer);
const crcTable = makeCRCTable();
let crc = 0xFFFFFFFF;
for (const byte of view) {
crc = (crc >>> 8) ^ crcTable[(crc ^ byte) & 0xFF];
}
return (crc ^ 0xFFFFFFFF) >>> 0;
}
注意事项
- 初始值和输出异或值需根据具体 CRC 标准调整
- 大端序/小端序处理需与目标系统保持一致
- 字符串编码会影响计算结果(建议统一使用 UTF-8)
- 查表法比直接计算快约 8-10 倍
以上实现可根据具体需求调整多项式、初始值和最终异或值等参数。






