Java中如何无需补位对齐整字节即可计算BitSet的CRC16值
可直接处理非整字节BitSet的CRC16实现方案
CRC16算法本质是逐比特运算的逻辑,市面常见的字节数组输入实现只是做了查表优化,完全可以自定义实现直接处理BitSet的原始比特,无需补位对齐。
实现要点
- 先确认你业务使用的CRC16参数集:包括多项式、初始值、结果异或值、输入输出是否翻转等核心配置,以下示例用通用的CRC16-IBM(多项式
0x8005、初始值0x0000、结果异或0x0000、输入输出不翻转)举例。 - 直接遍历
BitSet的每一位参与运算即可,无需做字节对齐。
参考实现代码
public static int calcCrc16FromBitSet(BitSet bs, int actualBitLen) { final int CRC16_POLY = 0x8005; int crc = 0x0000; for (int i = 0; i < actualBitLen; i++) { boolean currBit = bs.get(i); boolean highestBit = (crc & 0x8000) != 0; crc <<= 1; if (currBit ^ highestBit) { crc ^= CRC16_POLY; } } // 按需调整结果异或逻辑,此处保留16位有效位 return crc & 0xFFFF; }
调用说明
你直接传入业务的BitSet对象和实际比特长度545即可得到对应原始数据的CRC16结果,完全不需要补位操作。
如果需要更高性能,可以拆分处理:前544比特(68个整字节)用查表法计算,最后单独处理剩余的1比特,性能和整字节计算几乎无差异。
内容的提问来源于stack exchange,提问作者Phreag
相关产品推荐
相关产品推荐

