JAVA CRC16 函数返回 3 个字符响应而不是 4 个字符

标签 java crc crc16

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

关于JAVA CRC16 函数返回 3 个字符响应而不是 4 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288630/

相关文章:

java - Apache Camel 创建两个具有相同名称但扩展名不同的单独文件

java - 应用服务器和 Spring 上下文加载

java - 如何检查 Hashmap 值中的子字符串

algorithm - 反转CRC32

MySQL计算CRC16的函数

c++ - 如何确定CRC16初始校验和,因此校验和为零

java - 关于增加 JVM 的堆大小

java - 将用 C 编写的 CRC 8 函数转换为 Java

c++ - 无法弄清楚如何计算CRC7

python - 如何忽略 unicode 值并保留格式 '\x##' ?