我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:31 大小:168KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结.pdf

我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结.pdf

预览

免费试读已结束,剩余 21 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结果一致)wxleasyland(wxlwww@gmail.com)2010年9月2日比较愚钝,学了CRC校验好几天,很痛苦的过程,现终于有眉目了,总结一下。国外版的“轻松无痛苦学习CRC指南”,在http://www.repairfaq.org/filipg/LINK/F_crc_v31.html(为什么好的资料都是老外写的?)我的英文有限,这种专业性太强的文章,很多都看不太明白,所以没办法翻译,靠参考国内的翻译和自己瞎琢磨的。国内的翻译比较不全,而且有点误导,能看英文的还是看英文吧,国内版资料比较零散,可参考:http://www.q.cc/2001/12/08/10190.htmlhttp://www.360doc.com/content/10/0703/12/1317564_36621098.shtmlhttp://www.yuanma.org/data/2006/1010/article_1637.htm我结合国内资料和英文原版进行总结,达到和WINRAR一样的CRC32计算结果。一、CRC原理可参考http://www.luocong.com/articles/show_article.asp?Article_ID=15计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC。它不是真正的算术上的除法!过程和算术除法过程一样,只是加减运算变成了XOR(异或)运算!算术上的除法:120÷9=13余3,120是被除数,9是除数,13是商,3是余数。念作120除以9,或者9除120,或者9去除120!(除法的过程就不写了)这个除法计算机当然会做,但是做起来很麻烦,因为减法有借位,很耗时间和指令!所以,计算CRC也是除法,但是用XOR来代替减法,这就简单多了!CRC的除法:120÷9=14余6,商、余数和算术除法不一定相同!!因为除法用的是XOR,而不是真正的减法。以二进制模拟这个计算过程:1110商为1110,即14,商有4位,表示进行了4次XOR________1001/1111000被除数120是1111000,除数9是10011001^----1100第一次XOR后得到011,加入下一位0。最高位的0可以消掉了,这样最高位是1,所以下个商是11001^----1010第二次XOR后得到0101,加入下一位0。最高位的0可以消掉了,这样最高位是1,所以下个商是11001^----0110第三次XOR后得到0011,加入下一位0。最高位的0可以消掉了,这样最高位是0,所以下个商是00000^----110->最后一次XOR后得到0110,最高位的0可以消掉了,得到余数为110,即6注意,余数不是0110,而是110,因为最前面那个0已经被XOR后消掉了!可见,除法(XOR)的目的是逐步消掉最高位的1或0!由于过程是XOR的,所以商是没有意义的,我们不要。我们要的是余数。余数110是1111000的CRC吗?不是!余数110是1111(即十进制15)的CRC!!!为什么?因为CRC是和数据一起传送的,所以数据后面要加上CRC。数据1111加上CRC110后,变成1111110,再传送。接收机收到1111110后,除以除数1001,余数为000,正确;如果余数不为0,则说明传送的数据有误!这样完成CRC校验。即发送端要发送1111,先在1111后加000,变成1111000,再除以1001得到余数110,这个110就是CRC,将110加到数据后面,变成1111110,发送出去。接收端收到1111110,用它除以1001,计算得余数为000,就说明收到的数据正确。所以原始数据后面要先扩展出3位0,以容纳CRC值!会发现,在上面的除法过程中,这3位0,能保证所有的4个数据位在除法时都能够被处理到!不然做一次除法就到结果了,那是不对的。这个概念后面要用到。所以,实际上,数据是1111,CRC是110。对于除数1001,我们叫它生成多项式,即生成项,或POLY,即g(x)。数据1111根据POLY1001,计算得到CRC110。如果POLY不是1001,而是1011,那得到的CRC也是不同的!所以生成项不同,得到的CRC也不同。要预先定义好POLY,发送端和接收端要用一样的POLY!二、生成项上面例子中,生成项是1001,共4位比特,最高位的1,实际上在除法的每次XOR时,都要消掉,所以这个1可不做参考,后3位001才是最重要的!001有3位,所以得到的余数也是3位,因为最后一次除法XO