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