CRC 的生成
循环冗余校验 (CRC) 域为两个字节,包含一个二进制 16 位值。附加在报文后面的
CRC 的值由发送设备计算。接收设备在接收报文时重新计算 CRC 的值,并将计算结果于
实际接收到的 CRC 值相比较。如果两个值不相等,则为错误。 CRC 的计算, 开始对一个
16 位寄存器预装全 1. 然后将报文中的连续的 8 位子节对其进行后续的计算。只有字符中的
8 个数据位参与生成 CRC 的运算,起始位,停止位和校验位不参与 CRC 计算。
CRC 的生成简单的说就是:将数据除以某个固定的数(比如 ANSI-CRC16 中,这个数
是 0x18005),所得到的余数就是 CRC 校验码。这里的除法是做异或运算,这是人工笔
算时一般采用此方法。
下面是常用标准中的除数:
CRC8:多项式是 X8+X5+X4+1,对应的数字是 0x131,左移 8 位
CRC12:多项式是 X12+X11+X3+X2+1,对应的数字是 0x180D,左移 12 位
CCITT CRC16:多项式是 X16+X12+X5+1,对应的数字是 0x11021,左移 16 位
ANSI CRC16:多项式是 X16+X15+X2+1,对应的数字是 0x18005,左移 16 位
CRC32 :多项式是 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1 ,
对 应数字是 0x104C11DB7,左移 32
名称 生成多项式 简记式* 应用举例
CRC-4 x4+x+1 3 ITU G.704
CRC-12 x12+x11+x3+x+1
CRC-16 x16+x15+x2+1 8005 IBM SDLC
CRC-
ITU**
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
04C11DB
7
ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394,
PPP-FCS
CRC-32c x32+x28+x27+...
+x8+x6+1
1EDC6F4
1
SCTP
CRC 生成的算法实现:
CRC 的生成过程中, 每个 8–位字符与寄存器中的值异或。然后结果向最低有效位
(LSB) 方向移动(Shift) 1 位,而最高有效位 (MSB) 位置充零。 然后提取并检查 LSB:如果
LSB 为 1, 则寄存器中的值与一个固定的预置值异或;如果 LSB 为 0, 则不进行异或操
作。 这个过程将重复直到执行完 8 次移位。完成最后一次(第 8 次)移位及相关操作后,
下一个 8 位字节与寄存器的当前值异或,然后又同上面描述过的一样重复 8 次。当所有报
文中子节都运算之后得到的寄存器中的最终值,就是 CRC.
评论2
最新资源