CRC校验码算法的研究与实现
2012-03-31王根义
王根义
(陕西职业技术学院 陕西 西安 710100)
在通信系统的数据传输过程中,由于信道中各种复杂因素的影响,往往使传输的信号受到干扰,造成误码的出现。接收方为了检查所接收的数据是否有误码,可采用多种检测方法。差错控制编码是目前数据传输过程中普遍采用的一种提高数据通信可靠性的方法,而CRC是一种在实际通信中应用很广泛的差错控制编码,具有很强的检错能力。但由于国内对CRC技术应用的不够深入和不够广泛,许多检错改错工程死板地套用有限的模式,浪费了资源,本论文就是为了提高和推广国内的CRC技术,让相关人员能根据实际需要,灵活地采用CRC方法进行检错而撰写的。
1 有关符号的约定
模2除法就是在除的过程中用模2减法来减。模2加或模2减就是异或,结果都相同。本论文用“⊕”表示模2加,用“^” 表示异或,用“mod”表示求模。
2 分析研究按模2mod的相关性能
1)设信息码段为 h1h2h3h4h5h6H,生成多项式 g(x)的代码为11021H,分析研究计算CRC码的校验码段的过程。
设 (h1h2h3h4h5h6,0000H)按模 2mod(11021H)= (m3m2m 1m0H)。
如果先求出(h1h2,0000 H)按模 2mod (11021H)= (r3r2 r1r0H)
那么 [(h3h4h5h6,0000H)⊕(r3r2r1r0,0000 H)]按模 2 mod(11021H)= (m3m2m1m0H)。
如果先求出 [(h3h4,0000H)⊕(r3r2, 0000 H)]按模2mod(11021H)=(d3d2d1d0H)
那么[(h5h6,0000H)⊕(d3d2,0000 H)]按模 2mod (11021H)⊕(d1d0,00H) = (m3m2m1m0H)。
2)分析研究(h1H⊕h2H,0000H)按模 2mod(11021H)
设(h1H)=(a3a2a1a0B),(h2H)=(b3b2b1b0B),则
(h1H⊕h2H,0000H)按模 2mod (11021H)[1]
=(a3×219)B 按模 2mod (11021H)⊕
(a2×218)B 按模 2mod (11021H)⊕
(a1×217)B 按模 2mod (11021H)⊕
(a0×216)B 按模 2mod (11021H)⊕
(b3×219)B 按模 2mod (11021H)⊕
(b2×218)B 按模 2mod (11021H)⊕
(b1×217)B+(b0×216)B
可见, 如果 a3和 b3、a2和 b2、a1和 b1或 a0和 b0这 4对二进制数中,哪一对中的两个二进制数相等,则这一对二进制数对余数的作用就抵消了。
3 求CRC码的软件设计
在本论文的内容2中得到的结论非常重要,由此可以研制出用C语言编程求CRC校验码段的各种方法,在下面列举3种方法。
1)方法 1[2-4]
typedef unsigned char uchar;
typedef unsigned int uint;
code uchar crcbuff[]={0xe3,0xd2,0x0d,0x06,0x00,0x00,0x00,0x00};
uint crc; //CRC码
uint crc16l(uchar*ptr,uchar len);
void main(void)
{
uchar*ptr;
crc=0; //CRC初值
ptr=crcbuff; //指向第一个 Byte数据
crc=crc16l(ptr,8);
while(1);
}
uint crc16l (uchar*ptr,uchar len) /*ptr为数据指针,len为数据长度(数据元素的个数,8个字节数)*/……p>
