CRC校验原理

1、循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则 若设码字长度为N,信息字段为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
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。
4、CRC校验码软件生成方法:
    借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1 
      假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001
      x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000
采用多项式除法:  得余数为: 1010     (即校验字段为:1010)
发送方:发出的传输字段为:  1 0 1 1 0 0 1 1 0 10
                          信息字段       校验字段
接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)
                  如果能够除尽,则正确。
 
多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2 为模,加减时不进,错位,和逻辑异或运算一致。
采用 CRC 校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。CRC 的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC 校验码。校验时,以计算的校正结果是否为0 为据,判断数据帧是否出错。CRC 校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k 为g(x)的阶数)的突发错误。所以CRC 的生成多项式的阶数越高,那么误判的概率就越小。
CRC 校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC 校验码。其实现步骤如下:
(1) 设待发送的数据块是m 位的二进制多项式t(x),生成多项式为r 阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为x^r t(x)。
(2) 用生成多项式g(x)去除x^r t(x),求得余数为阶数为r-1 的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC 校验码。
(3) 用x^r t(x)以模2 的方式减去y(x),得到二进制多项式x^r t'(x)。x^r t'(x)就是包含了CRC校验码的待发送字符串。
从 CRC 的编码规则可以看出,CRC 编码实际上是将代发送的m 位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式x^r t'(x),所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多CRC 的硬件解码电路就是按这种方式进行检错的。同时x^r t'(x)可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r 位数据,得到的就是原始数据。