如何在TypeScript/JavaScript中实现指定CRC计算?求示例
JavaScript/TypeScript实现指定CRC计算(多项式0xC005)
你需要的CRC多项式是二进制11000000000000101,对应十六进制0xC005(多项式表达式:$x^{16} + x^{15} + x^2 + 1$)。以下是直接可用的JS/TS实现,支持输入十六进制字符串数组(如['01', '06', '00', '01', '00', '10']):
function calculateCRC(hexArray: string[]): string { // 定义CRC多项式(二进制11000000000000101 → 十六进制0xC005) const POLYNOMIAL = 0xC005; let crc = 0x0000; // 初始CRC值,可根据需求调整 // 遍历每个十六进制字符串,转换为字节值 for (const hexStr of hexArray) { const byte = parseInt(hexStr, 16); // 将当前字节与CRC的高8位异或 crc ^= byte << 8; // 对每个比特位进行移位异或操作 for (let i = 0; i < 8; i++) { // 检查最高位是否为1 if (crc & 0x8000) { crc = (crc << 1) ^ POLYNOMIAL; } else { crc <<= 1; } // 保留低16位 crc &= 0xFFFF; } } // 将结果转换为四位十六进制字符串,不足补零,大写输出 return crc.toString(16).padStart(4, '0').toUpperCase(); } // 测试示例 const inputHexArray = ['01', '06', '00', '01', '00', '10']; const crcResult = calculateCRC(inputHexArray); console.log(`CRC结果: ${crcResult}`);
关键细节说明
- 多项式转换:你提供的17位二进制除数,在CRC计算中会去掉最高位的
1,用剩余16位对应的十六进制0xC005参与运算,这是行业通用的简化方式。 - 输入兼容:如果你的输入是空格分隔的字符串(如
"01 06 00 01 00 10"),可以先通过split(' ')拆分转为数组后传入函数。 - 定制调整:示例初始CRC设为
0x0000,如果业务场景需要不同初始值(如0xFFFF)、输出反转或最终异或操作,直接修改对应逻辑即可。
扩展:直接处理空格分隔的十六进制字符串
如果用户输入是空格分隔的字符串而非数组,可添加一层封装:
function calculateCRCFromHexString(hexString: string): string { const hexArray = hexString.trim().split(' '); return calculateCRC(hexArray); } // 使用示例 const inputStr = '01 06 00 01 00 10'; console.log(calculateCRCFromHexString(inputStr));
内容的提问来源于stack exchange,提问作者EvanChen
相关产品推荐
相关产品推荐

