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


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



【例】假设使用的生成多项式是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