将用 C 编写的 CRC 8 函数转换为 Java
Converting CRC 8 function written in C to Java
我正在尝试将 CRC8 函数从 C 翻译成 Java。
我从硬件制造商那里得到了这段代码:
uint8_t CRCCalc (uint8_t* pointer, uint16_t len) {
uint8_t CRC = 0x00;
uint16_t tmp;
while(len > 0) {
tmp = CRC << 1;
tmp += *pointer;
CRC = (tmp & 0xFF) + (tmp >> 8);
pointer++;
--len;
}
return CRC;
}
我的Java代码是:
private int getCheckSum(byte[] data) {
int tmp;
int res = 0;
for(int i = 0; i < data.length; i++) {
tmp = res << 1;
tmp += 0xff & data[i];
res = (tmp & 0xff) + (tmp >> 8);
}
return res;
}
通常一切正常,但有时例如:
对于十六进制 0997AD0200,CRC 应该是 4,但我的代码给了我 8
我不确定我错过了什么。
此行不正确:
res = (tmp & 0xff) + (tmp >> 8);
原代码中CRC
是一个uint8_t
,所以计算结果应该在0-255范围内。因此你想要这个:
res = ((tmp & 0xff) + (tmp >> 8)) & 0xff;
在你的版本中发生了什么(如果你在你的 crc 循环中添加一些打印你可以看到)是当 tmp
变成 0x1FF
你得到 res = 0xFF + 1 == 0x100
,当它真的应该是 (uint8_t)(0xFF + 1) == 0
.
我正在尝试将 CRC8 函数从 C 翻译成 Java。
我从硬件制造商那里得到了这段代码:
uint8_t CRCCalc (uint8_t* pointer, uint16_t len) {
uint8_t CRC = 0x00;
uint16_t tmp;
while(len > 0) {
tmp = CRC << 1;
tmp += *pointer;
CRC = (tmp & 0xFF) + (tmp >> 8);
pointer++;
--len;
}
return CRC;
}
我的Java代码是:
private int getCheckSum(byte[] data) {
int tmp;
int res = 0;
for(int i = 0; i < data.length; i++) {
tmp = res << 1;
tmp += 0xff & data[i];
res = (tmp & 0xff) + (tmp >> 8);
}
return res;
}
通常一切正常,但有时例如: 对于十六进制 0997AD0200,CRC 应该是 4,但我的代码给了我 8
我不确定我错过了什么。
此行不正确:
res = (tmp & 0xff) + (tmp >> 8);
原代码中CRC
是一个uint8_t
,所以计算结果应该在0-255范围内。因此你想要这个:
res = ((tmp & 0xff) + (tmp >> 8)) & 0xff;
在你的版本中发生了什么(如果你在你的 crc 循环中添加一些打印你可以看到)是当 tmp
变成 0x1FF
你得到 res = 0xFF + 1 == 0x100
,当它真的应该是 (uint8_t)(0xFF + 1) == 0
.