1

我有一个如下所示的 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());
4

1 回答 1

2

ArrayIndexOutOfBoundException可能会收到,所以我认为十六进制值在其最重要的半字节中可能为零。尝试找出这些值(x)并检查(x >>> 12) == 0是否(x & 0xf000) == 0。如果返回 true,您可以0从左侧用必要数量的 s 填充您的字符串。

一种可能的方式:String.format("%04d", crrc)

于 2014-04-25T09:22:15.537 回答