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