天天看点

CRC校验的问题(c语言实现CRC校验和)

1. 前面的数 7A 01 00,计算的结果是0X4920

CRC校验的问题(c语言实现CRC校验和)

2. 那么把数据CRC加上

CRC校验的问题(c语言实现CRC校验和)

3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!!

CRC校验的问题(c语言实现CRC校验和)

4. 换了套代码,还是一样的值,难道说,CRC检验的必须是双数字节吗?我输入的是5个,或许我可以输入6个测试一下,也不行

5. 去CRC官网看了一下

CRC校验的问题(c语言实现CRC校验和)

对比下代码发现,CRC-16用的多项式应该是0XA001,总上所述,第3步的代码是错误的。那么我有疑问,为啥第3步的代码居然还有人在用?而且使用正确,我猜测那套产生自己的CRC,又检验自己的CRC,说起来是定制化的一套CRC,不是标准的CRC,所以那套CRC只能自产自销,如果去校验另外一个人产生的标准的CRC数据就会出错了。

CRC校验的问题(c语言实现CRC校验和)

6. 下面是从gitHUB上下载的代码实际测试可用。https://github.com/lammertb/libcrc

uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ) {

    uint16_t crc;
    uint16_t low_byte;
    uint16_t high_byte;
    uint16_t short_c;
    uint16_t short_p;
    const unsigned char *ptr;
    size_t a;

    crc     = CRC_START_SICK;
    ptr     = input_str;
    short_p = 0;

    if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {

        short_c = 0x00FF & (uint16_t) *ptr;

        if ( crc & 0x8000 ) crc = ( crc << 1 ) ^ CRC_POLY_SICK;
        else                crc =   crc << 1;

        crc    ^= ( short_c | short_p );
        short_p = short_c << 8;

        ptr++;
    }

    low_byte  = (crc & 0xFF00) >> 8;
    high_byte = (crc & 0x00FF) << 8;
    crc       = low_byte | high_byte;

    return crc;

}  /* crc_sick */