CRC16算法原理_第1页
CRC16算法原理_第2页
CRC16算法原理_第3页
CRC16算法原理_第4页
CRC16算法原理_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CRC算法及C实现学习体会2008-09-2015:21:13阅读161评论0字号:大中小订阅一、CRC算法原理CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以)后,再除以一个多项式,最后所得到的余数既是CRC码。假设数据传输过程中需要发送15位的二进制信息g=101001110100001,

2、这串二进制码可表示为代数多项式g(x)=xA14+xA12+xA9+xA8+xA7+xA5+1,其中g中第k位的值,对应g(x)中x”的系数。将g(x)乘以xAm,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC码。h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m将CRCB法称为CRC-m比如CRC-32、CRC-64等。国际通行标准可以参看/wiki/Cyclic_redundancy_checkg(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与

3、10101做xor运算:p:110011;1:1101011;1!011100:1明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x)=xA8+xA7+xA6+xA4+xA2+1,既h是9位的二进制串111010101。g010100111010000100000000h11101010101001101110000100000000h1110101010111000100000100000000h111010101000010001000100000000h11101010101100010000000000h11101010

4、10010111010000000h111010101g601010000100000h111010101gy0100101110000h111010101g8011111011000h111010101rQ0010001100经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。通过示例,可以发现一些规律,依据这些规律调整算法:1,每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。gk首位是11111101100011101010100010001

5、100gfe01111011000b=00r011110110002.每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。这样就可以舍弃h的首位,将b取h的后m位。比如CRC-8的h是111010101,b只需是11010101。ssb-Sis1010011101001110110101011001101100110111g:10100111010000100000000S首位:1g:10100111010000100000000b飞tsb飞sb-S*sb11010101111000101100010011010101000100010010001000010001001000100

6、0s首位:g=s首位:g:S首位:g=s首位:loioonioiooooiooooooooloioonioiooooioooooooooloioonioiooooiooooooooo蓝色表示寄存器S的首位,是需要移出的,b根据S的首位选择0或者h。黄色是需要移入寄存器的位。S,是经过位移后的SogBlB2B3B4B5B6010100111010000100000000查表法同样是上面的那个例子,将数据按每4位组成1个block,这样g就被分成6个block。下面的表展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的经4次迭代,B1被移出寄存器。被移出的部分,不我们关心的,我们关心的是这4次

7、迭代对B2和B3产生了什么影响。注意表中红色的部分,先作如下定义:B23=00111010bl=00000000b2=01010100b3=10101010b4=11010101b=b1xorb2xorb3xorb44次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,既:B23xorb1xorb2xorb3xorb4可以证明xor运算满足交换律和结合律,于是:B23xorb1xorb2xorb3xorb4=B23xor(b1xorb2xorb3xorb4)=B23xorbb1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定)

8、,同理,b3和b4都是由B1决定。通过B1就可以计算出bo另外,B1由4位组成,其一共2A4有种可能值。于是我们就可以想到一种更快捷的算法,事先将b所有可能的值,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b值,将B1移出,B3移入,与b计算,然后是下一次迭代。SfSBlB2B2B3bg:B1|B2|使用BB3B4B51查表得到B6SSB2B3B3#bg:B1|B2|使用B:B3B4B5B6Ii查表得到6|一r1rT111rrr1*1可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得,这样的算法可以大大提高运算速度。上面的方法是半字

9、节查表法,另外还有单字节和双字节查表法,原理都是一样的一一事先计算出2人8或2人16个b的可能值,迭代中使用寄存器前8位或16位查表获得bo反向算法之前讨论的算法可以称为正向CRCT法,意思是将g左边的位看作是高位,右边的位看作低位。G的右边加m个0,然后迭代计算是从高位开始,逐步将低位加入到寄存器中。在实际的数据传送过程中,是一边接收数据,一边计算CRM,正向算法将新接收的数据看作低位。逆向算法顾名思义就是将左边的数据看作低位,右边的数据看作高位。这样的话需要在g的左边加m个0,h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320。b的选择0还是h,由寄存器中右边第1位决定,而不是左边第1位。寄存器仍旧是向左位移,就是说迭代变成从低位到高位。00000000g=0000000010100111010000100000001S末位:0000000100000010g=0000000010100111010000110101011S末位:S10101001g:000000001010011101000010101

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论