打印

crc算法的疑问

[复制链接]
2010|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eyuge2|  楼主 | 2009-9-5 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eyuge2 于 2009-9-5 12:47 编辑

大家好,crc的原理和算法我在网上都找到了,比较了解。
现在比较疑惑的是,crc的原理和算法之间是如何对应的。
按照crc的原理,如果需要计算某个字节的crc-16的校验码,需要在这个字节后面补充2个字节的0,构成一个3字节的数据,然后对数据进行右移,根据移出的位的值来判断是否将生成多项式与数据进行异或运算。
但是常用的位算法都不是这样做得,根本不需要在字节后面填充2个字节的0,直接根据字节的相应的位与原始crc值的相应位进行异或,来判断是否需要将crc值与生成多项式进行异或运算。
可有哪位大侠知道中间是如何过渡,优化的?谢谢!

相关帖子

沙发
chunyang| | 2009-9-5 12:51 | 只看该作者
用数学手段计算一遍,如方程式的推理一般,你就会明白了。

使用特权

评论回复
板凳
jerkoh| | 2009-9-5 13:02 | 只看该作者
本帖最后由 jerkoh 于 2009-9-5 13:03 编辑

** 函数: cal_crc
** 入参: unsigned char *ptr, unsigned char len
** 返回: unsigned int crc
** 作者: jerkoh
** 说明:CRC16-CCITT x16+x12+x5+1 1021 初始crc=0; crc=0xffff
CRC寄存器组初始化为全"0"(0x0000)。
注意:CRC寄存器组初始化全为1时,最后CRC应取反

使用特权

评论回复
地板
eyuge2|  楼主 | 2009-9-10 11:59 | 只看该作者
谢谢,基本搞清楚了。
关于crc运算的基本概念可参考《A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS》前面的章节

关于如何从按位计算crc码过渡到按字节查表计算crc码,请参考《crctut1_htm CRC and how to Reverse it》的部分章节

关于从原理得出的算法优化得出实用算法请参考《CRC算法原理及C语言实现》

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

1366

帖子

9

粉丝