将C编写的CRC 8函数转换为Java
我正在尝试将CRC8函数从C转换为Java 我从硬件制造商那里得到了以下代码:将C编写的CRC 8函数转换为Java,java,c,crc,code-translation,Java,C,Crc,Code Translation,我正在尝试将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
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;
}
uint8\u t CRCCalc(uint8\u t*指针,uint16\u t len){
uint8_t CRC=0x00;
uint16_t tmp;
而(len>0){
tmp=CRC>8);
指针++;
--len;
}
返回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;
}
private int getCheckSum(字节[]数据){
int tmp;
int res=0;
对于(int i=0;i8);
}
返回res;
}
通常所有操作都很好,但有时,例如:
对于hex 0997AD0200,CRC应为4,但我的代码给出了8
我不确定我错过了什么。这行不正确:
res = (tmp & 0xff) + (tmp >> 8);
在原始代码中,CRC
是一个uint8\u t
,因此该计算的结果应在0-255范围内。因此,您希望改为:
res = ((tmp & 0xff) + (tmp >> 8)) & 0xff;
在您的版本中发生的事情(如果您在crc循环中添加一些打印,您可以看到)是,当
tmp
变成0x1FF
时,您得到res=0xFF+1==0x100
,而实际上应该是(uint8_t)(0xFF+1)==0
,这一行tmp+=0xFF&data[i]代码>与C中的不匹配。而且,uint8\t
指针是神秘的。还有一件事你应该知道,java没有“无符号”整数类型。资料来源:以前的烧伤。()@sircodesalot这就是为什么我会选择res=(tmp&0xff)+(tmp>>8)代码>