【问题标题】:How to translate this working JavaScript Code to calculate CRC16 into Java如何将这个工作的 JavaScript 代码翻译成 Java 来计算 CRC16
【发布时间】:2021-12-06 05:40:12
【问题描述】:

我需要为这样的十六进制代码计算 CRC16: 08010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E000000000000000001

上述十六进制字符串的预期结果是0000C7CF ( 51151 )

我有这个可用的 JavaScript 实现,我正在尝试将其转换为 Java:

var hex = "08010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E000000000000000001";

var str = '';
for (var i = 0; i < hex.length; i += 2){ 
  str += String.fromCharCode( parseInt(hex.substr(i, 2), 16) );
}

var crc = 0x0000;
var poly = 0xA001;

for (var pos = 0; pos < str.length; pos++) {
  crc ^= str.charCodeAt(pos);
  for (var i = 8; i !== 0; i--) {
    if ((crc & 0x0001) !== 0) {
      crc >>= 1;
      crc ^= poly;
    } else
      crc >>= 1;
  }
}
console.log( crc );
console.log( crc.toString(16) );

我目前在 Java 中的实现如下所示:

String hex = "08010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E000000000000000001";
byte[] arr = Hex.decodeHex( hex );
long polynomial = 0xA001;
long crc = 0x0000;
for (byte b : arr) {
    crc ^= b;
    for (int i = 8; i != 0; i--) {
        if ((crc & 0x01) != 0) {
            crc >>= 1;
            crc ^= polynomial;
        } else {
            crc >>= 1;
        }
    }
}
System.out.println( crc ); // -37776

不计算预期值。我做错了什么?

【问题讨论】:

  • 您的 JS 版本执行 if ((crc &amp; 0x0001) !== 0) { 而您的 Java 版本执行 if ((crc &amp; 0x01) != 0) {(for 循环内的第一行)可能导致问题?所有其他值都相似,所以我想这也应该相似?
  • java中的!=等价于Javascript中的!==
  • 我想指出,您在二进制与运算中使用的数字实际上是不同的(crc &amp; 0x0001 vs crc &amp; 0x01)而不是运算符。
  • 0x010x0001 不只是 1 吗?无论如何,0x010x0001 甚至只是 1 的结果。是一样的(在Java和JS中)
  • 你知道什么时候输出变得不同吗?如果不是,你可以尝试在每次迭代时输出,然后检查 JS 和 Java 版本在哪个迭代时不相等(例如,你可以将其与 git 或在线 diff 工具进行比较)

标签: javascript java translate crc16


【解决方案1】:

更改以下行

crc ^= b

crc ^= (b &amp; 0xff)

在 java 中,byte 的范围是 -128 到 127,所以你必须让它无符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2020-12-01
    • 2017-07-24
    • 2018-09-09
    • 2015-11-25
    相关资源
    最近更新 更多