赞
踩
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
模2除法
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
关键点
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤
示例
现假设我们使用的多项式为:G(X) = X^8+X^2+X^1+1
,要求出0x1A
的CRC-8校验码。下面是具体的计算过程:
G(X) = X^8+X^2+X^1+1
可知二进制一种有9位,第8位、第2位、第1位和第0位分别为1,则序列为100000111
。1 1010
,多项式的最高次为8,则在数据的后面加上8位0,数据变为1 1010 0000 0000
,然后使用模2除法除以除数100000111
,最终得到的除不尽的余数,变为我们要求的CRC-8结果。 计算过程如下图:
如上图,最后除不尽的余数为0x46,所以0x1A
按多项式G(X) = X8+X2+X+1
计算得到的CRC-8码为0x46。
CRC-8的计算软件上可以采用循环计算的方法,也可以采用查表法,下面的代码都是以多项式G(X) = X^8+X^2+X^1+1
来实现,其他的多项式也类似。
从上面的计算过程可以看到,多项式最高位为1,遇到需要异或数据最高位为1时, 才进行异或计算,并且异或后,最高位就为0了,最高位为0,下次也不需要异或了, 这样需要采用代码计算的方式,就可以把最高位去掉,不需要异或,最后结果也是一样的。
#define FACTOR (0x107 & 0xFF) //多项式因子(取低8bit) unsigned char calcCRC(unsigned char *pdat, unsigned int len) { unsigned char j; unsigned char crc = 0x00; while(len--) { crc ^= (*pdat++);//前一字节计算CRC后的结果异或上后一字节,再次计算CRC for (j=8; j>0; j--) { if (crc & 0x80)//高位为1,需要异或;否则,不需要 { crc = (crc << 1) ^ FACTOR; } else { crc = (crc << 1); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。