CRC校验原理与程序设计校验原理与程序设计
CRC是英文Cyclical Redundancy Check的缩写,翻译成中文通常称作循环冗余校验或简称为CRC校验。它是数
据传输领域中最常用的一种差错校验方法,其特点是传输数据和CRC校验值的长度可以任意选定。在当今手
机、计算机和数码产品普及的信息数字化时代,CRC校验无处不在。CRC分为多种标准,例如:CRC -12码通
常用来传送6-bit字符串。
1.CRC校验原理
在代数编码理论中,一个数值可以表示为一个多项式。例如:一个十进制数值2892,可以用多项式表示为2x3 + 8x2 + 9x +
2(x=10)。同理,一个二进制数值1010101对应的多项式为x6 + x4 + x2 + 1(x=2)。
生成CRC码的基本原理是:设被校验的数据为K位,校验码为R位,码字长度为N(=K+R),则对于CRC码集中的任一码字,存
在且仅存在一个R次多项式g(x),使得
V(x)=A(x)g(x)=xRm(x) + r(x);
其中: m(x)为被校验数据的K-1次多项式
r(x)为校验码的R-1次多项式
g(x)称为生成多项式:g(x)=g0 + g1x1 + g2x2 + ... + g(R-1)x(R-1) + gRxR
发送方通过指定的g(x)计算出CRC校验码,接收方则通过该g(x)来验证收到的CRC校验码。综上所述,一个完整的CRC校验
过程是:
发送方:根据要传送的K位原始数据(二进制码序列),以标准指定的多项式计算出一个R位校验码(CRC码),附在原始数据后
边,构成一个新的二进制码序列共K + R位,然后发送出去。
接收方:将接收到的数据除以与发送方相同的多项式值,如果能够除尽,则正确,否则证明出错。还有另外一种处理,就是接
收方用发送方相同的方法计算出接收到数据的CRC校验值,再与发送方发来的校验值比较,相同则正确,否则证明出错。
2. CRC校验码的计算步骤:
例如:有一个要发送的7位二进制数1011001;对应的m(x)=x6 + x4 + x3 + 1。设CRC校验码取4位并设g(x)=x4 + x + 1,则该多
项式对应的值是10011。根据CRC规则,为保证被除数够除,首先需将要发送的数扩大2R 即24倍(左移4位),得到
10110010000,对应的xRm(x)=x10 + x8 + x7 + x4 。
CRC校验码的生成本质其实就是采用模2除法取余数,该除法的简捷计算就是将除数和被除数按位做异或(相同为0,不同为
1。0^0=0; 0^1=1; 1^0=1; 1^1=0)运算。需要注意的是,进行异或运算时除数必须和被除数最高有效位对齐。下面是将
10110010000除以11001手工计算的演示,得到余数为1010,该值即是数据1011001的CRC校验值。
10110010000 将1011001左移4位
10011 多项式值与被除数最高有效位对齐
=00101010000 第1次异或结果
10011 多项式值与被除数最高有效位对齐
=00001100000 第2次异或结果
10011 多项式值与被除数最高有效位对齐
=00000101100 第3次异或结果
10011 多项式值与被除数最高有效位对齐
=00000001010 第4次异或结果
为了简便计算机程序求解CRC,在实际应用中通常把多项式值的最高位舍掉,并且将参加计算的数据高低位颠倒后再计算。
前面的演算数据颠倒后的运算情况如下:
00001001101
11001
00001010100
11001