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