js实现crc
CRC 算法简介
CRC(Cyclic Redundancy Check)是一种校验算法,用于检测数据传输或存储中的错误。其核心思想是将数据视为二进制多项式,通过模2除法生成校验码。
CRC 实现步骤
初始化CRC值 通常初始值为0xFFFF(16位CRC)或自定义值,具体取决于CRC标准。
let crc = 0xFFFF; // 16位CRC初始值
定义多项式 常见多项式如CRC-16-CCITT使用0x1021,需根据需求选择。

const polynomial = 0x1021; // CRC-16-CCITT多项式
逐字节处理数据 遍历数据缓冲区,每个字节与当前CRC值进行异或运算,并通过移位操作处理。
function calculateCRC(data) {
for (let i = 0; i < data.length; i++) {
crc ^= data[i] << 8;
for (let j = 0; j < 8; j++) {
crc = crc & 0x8000 ? (crc << 1) ^ polynomial : crc << 1;
}
}
return crc & 0xFFFF; // 确保结果为16位
}
最终CRC处理 部分算法要求对结果进行额外异或操作(如CRC-16标准需异或0xFFFF)。

crc ^= 0xFFFF; // 可选的后处理步骤
完整示例代码
function crc16(data) {
let crc = 0xFFFF;
const polynomial = 0x1021;
for (let byte of data) {
crc ^= byte << 8;
for (let i = 0; i < 8; i++) {
crc = crc & 0x8000 ? (crc << 1) ^ polynomial : crc << 1;
}
}
return crc & 0xFFFF;
}
// 使用示例
const buffer = new Uint8Array([0x01, 0x02, 0x03]);
console.log(crc16(buffer).toString(16)); // 输出16进制CRC值
不同CRC变体调整
若需实现其他CRC版本(如CRC32),需调整以下参数:
- 初始值(如CRC32用0xFFFFFFFF)
- 多项式(如CRC32用0x04C11DB7)
- 输出异或值(如CRC32用0xFFFFFFFF)
性能优化建议
对于高频调用场景,可预先生成256项的查找表(LUT)加速计算:
const crcTable = Array(256).fill(0).map((_, i) => {
let crc = i << 8;
for (let j = 0; j < 8; j++) {
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc & 0xFFFF;
});
function crc16Fast(data) {
let crc = 0xFFFF;
for (let byte of data) {
crc = (crc << 8) ^ crcTable[(crc >> 8) ^ byte];
}
return crc & 0xFFFF;
}






