CRC校验用于通讯过程中,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的n位CRC码,并附在信息后边,构成一个新的二进制码序列(共k+n位)发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行校验,以确定传送过程中是否出错。
n位CRC码产生的规则是先将要发送的二进制序列M(x)左移n位,然后再除以一个n+1位的多项式G(x),最后得到的n位的余数R(x)即是CRC校验码。
不同位数的CRC采用的G(x)取值如下:
1)CRC4 = X4 + X + 1
2)CRC8 = X8 + X5 + X4 + 1
3)CRC12 = X12 + X11 + X3 + X2 + 1
4)CRC16 = X16 + X15 + X2 + 1 (美国)
5)CRC-CCITT = X16 + X12 + X5 + 1 (欧洲)
6)CRC32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1
在接收端,将收到的数据除以G(x),若余数为0则表明校验正确,然后将收到的数据右移n位得到的值就是原始数据。
在计算CRC码的除法运算中,采用的是模2除(按位除)而不是算术除。因此,加法和减法的运算结果是一样的。
常用CRC16计算方法:
1)按位计算CRC
本位后的CRC码等于上一位CRC码乘以2后除以多项式(G(x)去除最高位),所得的余数再加上本位值除以多项式所得的余数。
2)按字节计算CRC
本字节后的CRC码等于上一字节余式CRC码的低8位左移8位后,再加上上一字节CRC右移8位(即取高8位)和本字节之和所求得的CRC码。
3)按半字计算CRC
本字节后的CRC 码等于上一字节CRC码的低12 位左移4位后,再加上上一字节余式CRC右移4位(即取高4位)和本字节之和后所求得的CRC码。
采用三种方法实现的CRC16(CCITT)源码:
https://static.assets-stash.eet-china.com/album/old-resources/2008/10/14/309bc57a-82dc-4aaf-b381-af73926af9c1.rar
用户182075 2008-12-11 23:21