我是一名有用的助手,可以为您翻译文本。
我收到了一段用C语言编写的代码,用于计算字节数组的CRC8值。现在需要将其翻译成Java。
以下是C代码:
CRC_POLYNOM = 0x9c;
CRC_PRESET = 0xFF;
unsigned int CRC = CRC_PRESET;
for (i = 0; i < Len; i++)
{
crc ^= FRAME[i];
for (j = 0; j < 8; j++)
{
if (crc & 0x01)
crc = (crc >> 1) ^ CRC_POLYNOM;
else
crc = (crc >> 1);
}
}
我在Java中所实现的是这样的:
public static long calculateCRC8(byte[] b, int len) {
long crc = CRC_PRESET;
for (int i = 0; i < len; i++) {
crc ^= b[i];
for (int j = 0; j < 8; j++) {
if ((crc & 0x01) == 0)
crc = (crc >> 1) ^ CRC_POLYNOM;
else
crc = crc >> 1;
}
}
return crc;
}
对于一个示例的字节数组:
byte[] b = new byte[] {1, 56, -23, 3, 0, 19, 0, 0, 2, 0, 3, 13, 8, -34, 7, 9, 42, 18, 26, -5, 54, 11, -94, -46, -128, 4, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 1, -32, -80, 0, 98, -5, 71, 0, 64, 0, 0, 0, 0, -116, 1, 104, 2};
C代码返回29,而我的Java代码返回44。我做错了什么?
我觉得这是因为Java只支持带符号的数据类型,那么该如何解决呢?
crc = ((crc >> 1) & 0xff) ^ CRC_POLYNOM; else crc = (crc >> 1) & 0xff; } } 返回 crc;
我已经使用 0xff 掩盖了三次右移。现在它返回 75。 - Alexander Ciesielski