Redis源碼分析(二十二)——CRC循環冗餘校驗

CRC循環冗餘校驗 :具體參見:http://blog.csdn.net/yuyixinye/article/details/40782337


字節型CRC校驗算法的一般描述爲

本字節的CRC碼,等於上一字節CRC碼的低8位左移8位,與 上一字節CRC右移8位(即上以字節的高8位)同本字節異或後所得的CRC碼 異或。 

其中“上一字節CRC右移8位(即上以字節的高8位)同本字節異或後所得的CRC碼” 該CRC碼通過查表得到。其查表索引爲:上一字節CRC右移8位(即上以字節的高8位)同本字節異或 值。


CRC碼錶:爲根據字節的二進制表示 以標準計算得到的。


字節型算法如下:
 1)CRC寄存器組初始化爲全"0"(0x0000)。(注意:CRC寄存器組初始化全爲1時,最後CRC應取反。) 
 2)CRC寄存器組向左移8位,並保存到CRC寄存器組。
 3)原CRC寄存器組高8位(右移8位)與數據字節進行異或運算,得出一個指向值表的索引。
 4)索引所指的表值與CRC寄存器組做異或運算。
 5)數據指針加1,如果數據沒有全部處理完,則重複步驟2)。

 6)得出CRC


uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l) {
    uint64_t j;

    for (j = 0; j < l; j++) {
        uint8_t byte = s[j];
        crc = crc64_tab[(uint8_t)crc ^ byte] ^ (crc >> 8);
    }
    return crc;
}


/* Test main */
#ifdef TEST_MAIN
#include <stdio.h>
int main(void) {
    printf("e9c6d914c4b8d9ca == %016llx\n",
        (unsigned long long) crc64(0,(unsigned char*)"123456789",9));
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章