CRC校验
即循环冗余校验,是数据通信领域中最常用的一种差错校验码,可以发现并纠正信息在存储或传送过程中连续出现的多位错误代码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。
CRC码是基于模2运算而建立编码规则的校验码,其特点是不考虑进位和借位的运算,规律如下:
(1) 模2加、模2减的结果相等
(2) 模2乘是按模2和求部分积之和
(3) 模2除是按模2减求部分余数,每求一位商应使部分余数减少一位。上商的原则是:当部分余数的首位为1,上商1;首位为0,上商0。当部分余数的位数小于除数的位数时,该余数即为最后余数。
CRC码的编码方法:
1) 设待编码的信息码组为Dn-1Dn-2......D2D1D0,共n位,可用多项式M(x)表示:
M(x)=Dn-1X^(n-1) + Dn-2X^(n-2) + ...... D2X^2 + D1X + D0X^0
注: 生成多项式应满足以下条件
(1) 任何一位发生错误,都应使余数不为0
(2) 不同位发生错误应使余数不同
(3) 对余数继续作模2除,应使余数循环
2) 将信息码左移k位,得到M(x)*X^k,即得到n+k位的信息码组
Dn-1+k * Dn-2+k * Dn-3+k * ...... * D1+k * D0+k * 000....00 (k个0),空出来的K位用来拼接校验码
3) CRC码就是用多项式M(x)*X^k除以生成多项式G(x),所得余数作为校验位。为了得到K位余数,G(x)必须是K+1位。
设所得余数为R(x),商为Q(x),则有:M(x) * X^k = Q(x)*G(x) + R(x)
4) 将余数拼接在空出来的K位,就构成了CRC码,用多项式表示为 M(x)*X^k + R(x) = Q(x) * G(x) + R(x) +R(x)
= Q(x) * G(x)
若是在传送过程中不出错,则余数一定为0;若在传送过程中出错,则余数不为0,再由余数指出哪一位出错。
例如:
有效信息为 =11011,生成多项式G(x)=X^4 + X^3 +1
生成多项式为 G(x)=X^4 + X^3 +1,信息码组左移4位,得到 110110000
空出来的4位用余数补上, R(x) = 110110000 / 11001
所得余数为 1011,所以CRC校验码为 11011 1011