计算给定十六进制字符串的CRC16-IBM校验和,只计算输入和输出不反转的
public class CRC16 {
private static final int POLY = 0x8005;// CRC-16多项式
private static final int WIDTH = 16;// CRC-16的位数
private static final int INITIAL_VALUE = 0x0000;// CRC-16的位数
private static final int XOROUT = 0x0000;// CRC-16的位数
/**
* 计算给定十六进制字符串的CRC校验和。
*
* @param hexString 需要计算CRC校验和的十六进制字符串。
* @return CRC校验和的十六进制表示。
*/
public static String calculateCRC(String hexString) {
int crc = INITIAL_VALUE;// 将CRC值初始化为初始值
int data;
for (int i = 0; i < hexString.length(); i++) {
data = Integer.parseInt(String.valueOf(hexString.charAt(i)), 16);// 将十六进制字符串的每个字符转换为整数
crc ^= (data << (WIDTH - 4)); // 将数据与CRC值进行异或运算
for (int j = 0; j < 4; j++) {
if ((crc & (1 << (WIDTH - 1))) != 0) { // 将数据与CRC值进行异或运算
crc = (crc << 1) ^ POLY;// 如果是,使用多项式进行异或运算
} else {
crc <<= 1;// 如果不是,将CRC值左移1位
}
}
}
crc ^= XOROUT;// 将最终的CRC值与XOROUT值进行异或运算
String s = ByteUtils.decimalToBinary(crc & 0xFFFF, 16);// 将CRC值转换为指定位数的二进制字符串
return ByteUtils.bin2hex(s); // 将CRC值转换为指定位数的二进制字符串
}
}