tinyos :Cyclic redundancy check

原文链接:http://www.cnblogs.com/van9ogh/archive/2012/03/27/2419866.html

tinyos2.0的CRC16

在tinyos/tos/lib/tosboot/crc.h文件中有关于ITU Standard CRC-16的实现

生成多项式为:G_16(x) = x^16 + x^12 + x^5 + 1

 1 uint16_t crcByte(uint16_t crc, uint8_t b)
 2 {
 3   uint8_t i;
 4 
 5   crc = crc ^ b << 8; //表示新的数据和生成的CRC可以进行合并,即先将crc左移8位再和b异或
 6   i = 8;
 7   do
 8     if (crc & 0x8000) //如果最高位为1那么先将crc左移移位再与0x1021异或,其实这里的0x1021表示

                         //x^12+x^5+1多项式,也就是说,这里将原来的0x11021分成了0x8000和0x11021

                         //0x8000用来检测第16位是否为1(最后的CRC就是16位的)

 9       crc = crc << 1 ^ 0x1021;

10     else              //否则,除数比被除数大,向后移一位什么也不做
11       crc = crc << 1;
12   while (--i);
13 
14   return crc; 

15 }

这个算法可以使多字节数据的生成CRC.

参考: 

[1]. http://hi.baidu.com/wchonline/blog/item/d857fddf9691351048540340.html CRC校验算法

[2]. http://www.cnblogs.com/esestt/archive/2011/10/13/848856.html 循环冗余检验 (CRC) 算法原理

其中[2]对CRC查表 算法的解释非常到位,推荐!

CRC查表:

也就是可以通过对B1的前四位上的值来判断1->h, 0->0,得到b1,b2,b3,b4,进而通过b1^b2^b3^b4 -> b'

可以建立一张b'关于B1的表,这样每次就不需要移动一位进行迭代计算了,可以直接移动四位,速度就上来了,

这就是所谓的半字节查表,当然也可以建立 单字节查表,双字节查表,原理是一回事.

 

 

 

 

 

 

转载于:https://www.cnblogs.com/van9ogh/archive/2012/03/27/2419866.html

上一篇:杂项


下一篇:如何在PHP HEX中计算CRC16 CCITT?