(1)问题提出
在我的一个项目里,有一部分数据需要用CRC-16算出校验码。规则如下。
从上面看CRC16算法包含几个要素,多项式,BIT反转,初始值,加密值。
于是在网上搜了很多CRC16算法,千奇百怪。
(2)解决问题
最后用hutools(https://hutool.cn/docs)中自带的CRC16算法解决了问题。方法如下。
(2.1)引用pom.xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
(2.2)代码实现
private static void testCrc(String hexString) {
//16进制字符串转byte[]数组
byte[] bytes = HexUtil.decodeHex(hexString);
// CRC-16校验对象
CRC16 crc16 = new CRC16();
// 计算CRC-16校验值(使用默认的初始值和多项式)
crc16.update(bytes,0,bytes.length);
// 获取校验值
long crc16Value = crc16.getValue();
// 将校验值转换为十六进制格式
System.out.println("CRC-16: " + Long.toHexString(crc16Value));
}
代码非常简单。先是吧16进制数组转成byte[],然后调用crc16的方法计算出校验值。
(2.3)改参数怎么办
上面的代码非常简单,但是回到我们第一个界面,右边是可以改的。如果我改了怎么办。
后来我读了源码:
这个CRC16IBM又是什么?
重点来了,原来Hutools实现了各种算法,每个类的前面描述了多项式,BIT反转等内容。
(3)解题
正确的代码如下:
private static void testCrc(String hexString) {
//16进制字符串转byte[]数组
byte[] bytes = HexUtil.decodeHex(hexString);
// CRC-16校验对象
CRC16 crc16 = new CRC16(new CRC16CCITT());
// 计算CRC-16校验值(使用默认的初始值和多项式)
crc16.update(bytes,0,bytes.length);
// 获取校验值
long crc16Value = crc16.getValue();
// 将校验值转换为十六进制格式
System.out.println("CRC-16: " + Long.toHexString(crc16Value));
}