将C编写的CRC 8函数转换为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

我正在尝试将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;
}
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)