CRC校验原理 crc公式

1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为'0’和'1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。

3、CRC码集选择的原则:若设码字长度为N,信息字段(也就是真实的数据,在计算机中为bit流)为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得

V(x)=A(x)g(x)=xRm(x)+r(x);

其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,

g(x)称为生成多项式:

g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR

其实A(X)和g(x)都是系数仅为0和1的多项式

发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

4、CRC校验码软件生成方法:

借助于多项式除法,其余数为校验字段。

例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1

假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001,这里R=4

x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000,也就是信息码左移R=4位;

采用多项式除法,采用模2加减运算法则: 0+0=0, 1+1=0, 1 + 0 = 1, 1-0=1, 0-1 = 1, 1-1=0-0=0, 加法减法等价,做加法时不进位,实际上就是异或法则,做x4m(x) / g(x)的运算:

其运算过程如下:

11101|110,0000

11101

10100

11101

1001

101

得余数为: 1010 (即校验字段为:1010)

发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10

信息字段 校验字段

接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,

再看一个例子,这位Cheney Shue老兄写得很明白啊:

假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。国际通行标准可以参看http://en.wikipedia.org/wiki/Cyclic_redundancy_check

g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算:



明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。



经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:

1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。



2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。这样就可以舍弃h的首位,将b取h的后m位。比如CRC-8的h是111010101,b只需是11010101。



3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。每次迭代计算前先将S的首位抛弃,将寄存器左移一位成S,,同时将g的后一位加入寄存器。若使用此种方法,计算步骤如下:

※蓝色表示寄存器S的首位,是需要移出的,b根据S的首位选择0或者h。黄色是需要移入寄存器的位。S'是经过位移后的S。



查表法

同样是上面的那个例子,将数据按每4位组成1个block,这样g就被分成6个block。



下面的表展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的。



经4次迭代,B1被移出寄存器。被移出的部分,不我们关心的,我们关心的是这4次迭代对B2和B3产生了什么影响。注意表中红色的部分,先作如下定义:

B23 = 00111010

b1 = 00000000
CRC校验原理 crc公式

b2 = 01010100

b3 = 10101010

b4 = 11010101

b' = b1 xor b2 xor b3 xor b4

4次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,既:

B23 xor b1 xor b2 xor b3 xor b4

可以证明xor运算满足交换律和结合律,于是:

B23 xor b1 xor b2 xor b3 xor b4 = B23 xor (b1 xor b2 xor b3 xor b4) = B23 xor b'

b1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定),同理,b3和b4都是由B1决定。通过B1就可以计算出b'。另外,B1由4位组成,其一共2^4有种可能值。于是我们就可以想到一种更快捷的算法,事先将b'所有可能的值,这实际上就是B100000000的4次运算结果,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b'值,将B1移出,B3移入,与b'计算,然后是下一次迭代。



查表事实上的原理不是这样的,不过它给人的启发式:把这看成生成多项式是16位的除法,Bn都是1个字节,那么B1字节的CRC码就是第一次的b',B2B3^b'=B2'B3', B2'=CRCB1^(B2<<8) >> 8, B2'的CRC码就是第二次的b',以此类推每次算8位,当所有字节处理完也就得到的了最终的CRC码,这种算法的速度也很快。

可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得

,这样的算法可以大大提高运算速度。

上面的方法是半字节查表法,另外还有单字节和双字节查表法,原理都是一样的——事先计算出2^8或2^16个b'的可能值,迭代中使用寄存器前8位或16位查表获得b'。

反向算法

之前讨论的算法可以称为正向CRC算法,意思是将g左边的位看作是高位,右边的位看作低位。G的右边加m个0,然后迭代计算是从高位开始,逐步将低位加入到寄存器中。在实际的数据传送过程中,是一边接收数据,一边计算CRC码,正向算法将新接收的数据看作低位。

逆向算法顾名思义就是将左边的数据看作低位,右边的数据看作高位。这样的话需要在g的左边加m个0,h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320。b的选择0还是h,由寄存器中右边第1位决定,而不是左边第1位。寄存器仍旧是向左位移,就是说迭代变成从低位到高位。

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/198725.html

更多阅读

VS2013安装失败解决办法 crc校验失败 解决办法

VS2013安装失败解决办法——简介VS2013 是微软目前功能最为强大的编译器。不过,有一些朋友却在安装 VS2013 时提示某些组件安装失败,这该怎么办呢?VS2013安装失败解决办法——工具/原料VS2013VS2013安装失败解决办法——一、确保安装

互感器校验仪 全功能互感器校验仪

互感器校验仪——简介 互感器校验仪能在1%额定工作电流下测量电流互感器的误差。在检测过程中仪器能方便地随时进行自校,以保证仪器的精度。关键元器件使用进口组件,质量稳定可靠,广泛用于计量、供电等部门和互感器生产厂家,是开展互感

如何验证MD5校验值 md5值校验工具v3.26

如何验证MD5校验值——简介有时候大家在网上下载的系统镜像iso文件或者某些邮件带有MD5加密算法的文件,为了文件的安全性,也就是为了保证文件没有被别人篡改过,文件发布者(对于系统镜像来说尤其重要)会在文件发布的同时附上MD5校验码、哈

如何进行MD5校验 md5校验工具

如何进行MD5校验——简介    大家有没有注意到下载一些软件,它的信息里标注有MD5码? MD5在软件发布时经常使用,是为了保证文件的正确性,防止一些人盗用程序,加木马或者篡改版权,设计的一套验证系统。每个文件都可以用MD5验证程序算出

关于蒸汽管道安全阀的校验问题 进口蒸汽安全阀

最新《锅炉安全技术监察规程》第十六条在用蒸汽锅炉的安全阀每年至少应校验一次。检验的项目为整定压力、回座压力和密封性等。安全阀的校验一般应在蒸汽锅炉运行状态下进行。如现场校验困难或对安全阀进行修理后,可在安全阀校验台

声明:《CRC校验原理 crc公式》为网友逃避爱情分享!如侵犯到您的合法权益请联系我们删除