前言:循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错、纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位传送)的辅助存储器与主机的数据通信和计算机网络中。
CRC循环冗余校验利用生成多项式为 k 个数据位产生 r 个校验位,其编码长度为 k + r 。由此可知,循环冗余校验码由两部分组成:左边是信息码(数据),右边是校验码。若信息码占 k 位,则校验码占 n - k 位( r = n - k)。其中,n 为CRC码的字长,所以又称为 ( n , k )码。校验码是由信息码产生的,校验码位数越长,该代码的校验能力就越强。
发送端的信息码除以生成多项式的余数作为校验码,跟在数据码后面形成CRC码,然后发送数据。接收端接收数据后,除以生成多项式(接收端和发送端的生成多项式约定为相同),若结果为0,表示正常收到数据;若结果不为0,则表示数据传输过程中出现了差错。
假设现有数据如下:
数据码:1011 0011生成多项式:11001则计算校验码过程如下: 1. 确定校验码位数——校验码位数 = 生成多项式位数 - 1 上述原则是模2除法中必须满足的一条原则,就跟整数的除法中,余数永远小于被除数一样。上述生成多项式为5位,校验码位数为4位。 2. 在数据码后添加与校验码位数相同的0 得到的新数据为 1011 0011 0000 3. 进行模2除法,得到余数 模2运算就是在该位进行异或运算,没有进位或者借位。计算可得余数0100
4. 将余数和被除数相加,得到一个能被生成多项式整除的CRC码 新的CRC码为1011 0011 0100
当接收到数据后,除以生成多项式11001,若结果为0,则表示数据正确传输;否则则表示数据在传输过程中出现了错误。
CRC生成多项式要求最高位和最低为必须位1,因为最高位为0就会使得 s 位的多项式变成 s-1 位;最低位为零,就会成为2的整数倍导致没有余数。 以下是常见的CRC生成多项式:
名称生成多项式CRC-4x4+x1+x0CRC-8x8+x5+x4+x0CRC-8x8+x2+x1+x0CRC-8x8+x6+x4+x3+x2+x0CRC-12x12+x11+x3+x1+x0CRC-16x16+x15+x2+x0CRC16-CCITTx16+x12+x5+x0CRC-32X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0