CRC校验算法

来源:互联网 发布:小猪cms三网通 编辑:程序博客网 时间:2024/06/16 16:58

更好的组织信息,以帮助更好的理解。----爱自在

 

先上一个小例子把。这个例子来自百度百科

 

【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求CRC编码后的报文。
 
解:
1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。转换方法:将多项式最高位的X的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0
2、此题生成多项式有4位(R+1)的生成多项式计算所得的CRC校验码位数为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000 
3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或(同为0异为1)
1010000
1011
------------------
0001000
1011
------------------
0011
得到的余位011,所以最终编码为:1010 011 原始报文 + CRC校验码  或者信息字段 + 校验字段 或者 信息码 +校验码, 
 
 
 
接收放接收到这个编码后的数据后只要用编码字段/生成多项式 如果余数为零则说明是正确的。在这里也就是 1010011/1011,最高位对齐,做异或运算就行了。
 
看到这里,应该对CRC校验若有所悟,看来一个生成多项式与CRC密切相关。生成多项式的最高位决定了CRC校验码的位数。生成多项式对应的二进制数与原始报文一起决定了校验码的内容。生成多项式是发送方和接收方约定好的。
 
 再看下生成CRC编码的步骤:
1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式C(X)*2R
3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码

 

附:

标准CRC生成多项式如下表:

   名称                    生成多项式                          简记式*  标准引用
   CRC-4                x4+x+1                                       3         ITU G.704
   CRC-8                x8+x5+x4+1                              0x31                  
   CRC-8                x8+x2+x1+1                              0x07                  
   CRC-8                x8+x6+x4+x3+x2+x1                0x5E
   CRC-12              x12+x11+x3+x+1                      80F
   CRC-16              x16+x15+x2+1                          8005      IBM SDLC  根据需要反转后写成A001
   CRC16-CCITT   x16+x12+x5+1                          1021      ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
   CRC-32              x32+x26+x23+...+x2+x+1         04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
   CRC-32c            x32+x28+x27+...+x8+x6+1       1EDC6F41 SCTP

 

 

 

 

0 0
原创粉丝点击