【问题标题】:Java code for CRC 16 calculation用于 CRC 16 计算的 Java 代码
【发布时间】:2018-02-21 00:46:23
【问题描述】:

下面是我的十六进制字符串

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";

这是我的 CRC : A228 附加到上面的字符串。 我希望输出为 A228

使用的多项式是 0xA001

谁能给我计算CRC16的代码

下面是我的java代码

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";//A228";

    byte arr[] = toByteArray(str);


        long polynomial = 0xA001;
        long CRC = 0xFFFF;

        for (byte b : arr)
        {
            CRC ^= b;
            for (int i = 8; i != 0; i--)
            {
                if ((CRC & 0x0001) != 0)
                {
                    CRC = (CRC >> 1) ^ polynomial;
                }
                else
                {
                    CRC >>= 1;
                }
            }
        }



        System.out.println(CRC);

}

我得到的输出为 -56289

【问题讨论】:

  • 这不是 StackOverflow 的工作方式。你试过什么?你试过谷歌crc16 java吗?
  • 当然可以!
  • 这个例子怎么样:stackoverflow.com/a/13209435/921563
  • 首先,您的toByteArray 实现似乎是错误的,因为您的代码在使用正确的十六进制解码str 时输出-56855。
  • 你肯定不会通过打印一个 long 来看到 A228,因为 long 只会包含数字。也许您打算使用 System.out.printf("%x%n", CRC); 以十六进制打印它?

标签: java crc crc16


【解决方案1】:

您的代码大部分都很好,并且会为该消息生成0xa228(进行下面的修改),但您必须为其提供正确的数据,然后正确显示生成的 CRC。

要为其提供正确的数据,您首先需要将该十六进制字符串转换为二进制字节数的一半。把 那个 交给你的 CRC 例程。

其次,以十六进制显示结果,而不是十进制。

第三,byte 已签名,CRC ^= b & 0xff; 也已签名以避免符号扩展。

【讨论】:

  • 我正在将字符串转换为字节数组。我也将它打印成十六进制,但我仍然得到输出:ffffffffffff3637
  • 仔细阅读我的回答。您需要将 十六进制 转换为字节。您的 1460 个字符将变为 730 个字节,而不是 1460 个字节。
  • 另外我注意到您需要修复 Java 中的签名字节问题。
  • 您需要提供您的toByteArray 例程才能了解这里的实际情况。
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2014-04-21
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多