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;
}