将用C编写的CRC 8函数转换为Java

时间:2015-05-14 12:06:40

标签: 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 >> 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

我不确定我错过了什么。

1 个答案:

答案 0 :(得分:5)

此行不正确:

res = (tmp & 0xff) + (tmp >> 8);

在原始代码中CRCuint8_t,因此该计算的结果应在0-255范围内。因此,你想要这个:

res = ((tmp & 0xff) + (tmp >> 8)) & 0xff;

您的版本中发生了什么(您可以在crc循环中添加一些打印件时看到),当tmp变为0x1FF时,您获得res = 0xFF + 1 == 0x100,它应该是(uint8_t)(0xFF + 1) == 0