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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值