天天看點

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 */