我有一个Java CRC16函数,如下所示,我需要它返回一个4长度的字母数字结果。但有时它只返回一个3长度的字母数字。为什么?我将这个CRC与计算CRC的C应用程序进行交叉比较,通常它是相同的CRC,但JAVA不时返回3个字符的结果,这会引发异常。为什么?
int crrc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
String str = "0009";
byte []by = x; // x is the byte array from args
for (byte b : by) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crrc >> 15 & 1) == 1);
crrc <<= 1;
if (c15 ^ bit) crrc ^= polynomial;
}
}
crrc &= 0xffff;
System.out.println(crrc);
System.out.println("CRC16-CCITT = " + Integer.toHexString(crrc) + " " + Integer.toHexString(crrc).length());
您可能正在接收ArrayIndexOutOfBoundException
,所以我认为十六进制值在其最重要的半字节中可能为零。尝试找出这些值(x
),并检查是(x >>> 12) == 0
还是(x & 0xf000) == 0
。如果返回true,则可以在字符串中从左边开始填充必要数量的0
。
一种可能的方式:String.format("%04d", crrc)