CRC校验原理及推导过程,crc校验

描述

 CRC校验基本原理

 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。

 CRC检验码的计算

 设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:

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

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

 这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。

 r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。

 循环冗余检验

 循环冗余检验英文名称为Cyclical Redundancy Check,简称CRC。它是利用多项式除法及余数的原理来做错误检测的。它将要发送的数据比特序列当作一个信息多项式u(x)的系数,发送时去除以约定的生成多项式g(x),得到一个余数多项式v(x),将余数多项式加到信息多项式之后发送到接收端,接收端同样用g(x)去除接收到的接收多项式r(x),进行计算,然后把计算结果与由生成多项式g(x)决定的固定序列比较,来检测传输错误。由此可以看出其同时具有循环码和冗余码的特征,所以这种错误检测方法叫循环冗余校验,编码叫循环冗余校验码。

 理论上可以证明循环冗余校验码的检错能力有以下特点:

 (1)可检测出所有奇数位错。

 (2)可检测出所有双比特的错。

 (3)可检测出所有小于、等于校验位长度的突发错。

 CRC码编码

 归纳起来有以下三步骤:

 编码电路有两种方式:

 1,信息位由高位到低位的顺序从循环移位寄存器体左侧依次输入,信息位完全进入循环体后继续输入n−k−1个0,最后循环体中寄存器的值就是余式码字;

 图1 左侧串行输入循环移位寄存器体

 2,信息位由高位到低位的顺序从循环移位寄存器体右侧依次输入,信息位完全进入循环体后寄存器的值就是余式码字。

 图2 右侧串行输入循环移位寄存器体

 注:1,移位寄存器循环体中余式码字低位在左侧,高位在右侧。


 CRC码校验


 CRC码校验的基本原理

 所有的CRC校验都是基于以下这个等式:


 发送端M和G(对某一种确定的CRC校验,其G是固定的)是已知的,CRC计算就是 为了求出校验字段R;接收端M,R,G都是已知的,主要的操作都是为了验证等式是否成立,方法有很多种。

 下表展示了用于被用于一些常用的CRC标准的生成多项式,Hex列表示生成多项式对应的十六进制,MSB(most significant bit,可以理解为最左边的一位)省略,因为该位总是为1:

 发送端和接收端的具体处理方法

 CRC校验码在工程应用过程中相比数学计算稍微有些变化:

 1,在发送端对全0数据包的编码处理。

 数学计算中,当信息字段全部为0时的得到的余式码字也是全零的,但是在工程应用中,当非0信息字段在编码后发送给接收端,在线路传输中出现干扰或者是其他情况的错误,导致接收端收到的全零数据,即信息字段和余式字段都为0。如果在发送端不做特殊处理,在接收端就检验不出来这样的错误数据包。于是,在通信传输时,很多协议规定在发送端对CRC编码时定义一个Key寄存器,对CRC编码进行初始化,定义一个不为0的初值,Key寄存器通常被设置为全1。结合图1、图2来说,就是在信息输入给循环体之前,其D触发器的值为1。

 2,对接收端收到的数据包中拖尾0数据的处理。

 接收端接收到信息字段和余式字段,计算出数据包的余式码字,并与余式字段做比较,就能检测出错误。更简单的做法是,接收端对接收 到的所有数据求余式(包括信息字段和余式字段),如果没有传输错误所得的余式一定为0。但是,余式为0并不一定能够说明数据包没有改变,如果数据包在余式字段后有0增加或者删除的情况出现,就无法被检测出来。

 为了更好的理解公式的推导过程,需要用到1.2节中的几个关于取模运算法则。接收端如何才能识别无差错的传输呢?我们知道在发送侧满足:



 余式值用十六进制表示:C704DD7B。

 到此,关于通信用的CRC校验实现原理除了通信过程中比特流顺序之外,基本上是理顺,使得知其然也知其所以然。

相关推荐

相关文章