更好的组织信息,以帮助更好的理解。----爱自在
先上一个小例子把。这个例子来自百度百科
【例】假设使用的生成多项式是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