天天看点

国际标准协议之CRC

CRC

计算过程:

1.生成多项式,得到除数;

2.为发送数据补齐(位宽)个0,使用模2除法计算CRC;

3.将发送数据与CRC组合,生产新的数据。

CRC-16中表示位宽为16,实际数据17;

由位宽可知多项式的最高位肯定为1,故在简记式中,将最高的1统一去掉了,如CRC32的生成多项式简记为04C11DB7实际上表示的是104C11DB7;

CRC为校验和的一种,是两个字节数据流采用二进制除法(没有进位,使用XOR来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为

国际标准协议之CRC

的预定义(短)的二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上

国际标准协议之CRC

个0.

常用CRC(按照ITU-IEEE规范)

名称 多项式 表示法:正常或者翻转
CRC-1
国际标准协议之CRC
(用途:硬件,也称为奇偶校验位)
0x1 or 0x1 (0x1)
CRC-5-CCITT
国际标准协议之CRC
(ITU G.704标准)
0xB(0x??)
CRC-5-USB
国际标准协议之CRC
(用途:USB信令包)
0x5 or 0x14 (0x9)
CRC-7
国际标准协议之CRC
(用途:通信系统)
0x9 or 0x48 (0x11)
CRC-8-ATM
国际标准协议之CRC
(用途:ATM HEC)
0x7 or 0xE0 (0xC1)
CRC-8-CCITT
国际标准协议之CRC
(用途:1-Wire总线)
0x8D
CRC-8-Dallas/Maxim
国际标准协议之CRC
(用途:1-Wirebus)
0x31 or 0x8C
CRC-8
国际标准协议之CRC
0xD5(0x??)
CRC-10 x10 + x9 + x5 + x4 + x + 1 0x233(0x????)
CRC-12
国际标准协议之CRC
(用途:通信系统)
0x80F or 0xF01 (0xE03)
CRC-16-Fletcher 参见Fletcher's checksum 用于Adler-32 A & B CRC
CRC-16-CCITT x16 + x12 + x5 + 1(X25,V.41,Bluetooth,PPP, IrDA) 0x1021 or 0x8408 (0x0811)
CRC-16-IBM x16 +x15 + x2 + 1 (用途:Modbus) 0x8005 or 0xA001 (0x4003)
CRC-16-BBS x16 + x15 + x10 + x3(用途:XMODEM协议) 0x8408(0x????)
CRC-32-Adler See Adler-32 参见Adler-32
CRC-32-MPEG2 See IEEE 802.3 参见IEEE 802.3
CRC-32-IEEE 802.3
国际标准协议之CRC
0x04C11DB7 or 0xEDB88320 (0xDB710641)
CRC-32C(Castagnoli)
国际标准协议之CRC
0x1EDC6F41 or 0x82F63B78 (0x05EC76F1)
CRC-64-ISO
国际标准协议之CRC
(use: ISO 3309)
0x000000000000001B or 0xD800000000000000 (0xB000000000000001)
CRC-64-ECMA-182
国际标准协议之CRC
国际标准协议之CRC
(as described in ECMA-182   p.63)
0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
CRC-128 IEEE-ITU标准。被MD5 &SHA-1取代
CRC-160 IEEE-ITU标准。被MD5 &SHA-1取代

具体来说,CRC校验的实现分为以下几个步骤:

1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式又称生成多项式)。

2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,接着以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,又称FCS(帧校验序列)。但要注意的是,余数的位数比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。

3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

通过以上介绍,大家一定可以理解CRC校验的原理了。

从上面可以看出,CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”,如在IBM的SDLC(同步数据链路控制)规程中使用CRC—16(也就是这个除数一共是17位)生成多项式g(x)=x16+x15+x2+1(对应二进制比特串为11000000000000101);而在ISOHDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT—16生成多项式g(x)=x16+x15+x5+1(对应二进制比特串为11000000000100001)。

2.CRC校验码的计算示例

由以上分析可知,除数是随机或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是校验码(CRC校验码)。

下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X)=X4+X3+1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:

1)首先把生成多项式转换成二进制数,由G(X)=X4+X3+1可以知道,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其他位为0)很快就可得到它的二进制比特串为11001。

2)因为生成多项式的位数为5,根据前面的介绍得知,CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的结果为0100,如图5-10所示。注意参考前面介绍的“模2除法”运算法则。

3)用上步计算得到的CRC校验替换帧101100110000后面的4个“0”,得到新的帧101100110100。再把这个新帧发送到接收端。

4)当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。

通过以上对CRC校验原理的剖析和CRC校验码计算示例的介绍,大家应该对这种看似很复杂的CRC校验原理和计算方法比较清楚了。