CRC-16校验的问题?
首先感谢大家看帖,小弟就这么点家当了,只剩20分不好意思。
这两天BOSS发话了,要做一个XMODE协议的通信。这个一些中有一部分需要用到CRC-16校验,我在网上收索了两天 未果。恳请兄弟们帮帮忙。
要求是这样的:对一个128字节的数据区进行CRC-16校验,把校验后的CRC结果保存在一个字节中。
我在网上找到了一些代码,但是看得雾里云里、云里雾里的。他是把128字节当成一个整体串起来后移位还是每个字节移位? 如果是每个字节移位的话应该每个字节产生一个CRC结果啊,这样最终的一个字节也保存不了这么多啊。
麻烦热心的朋友能写一下代码,并注上注释,我感激你们,谢谢!!
CRC-12 : G(x)=x12+x11+x3+x2+x+1;
CRC-16 : G(x)=x16+x15+x2+1;
CRC-CCITT: G(x)=x16+x12+x5+1;
CRC-32 : G(x)=x32+x26+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
[解决办法]
CRC16 检验和貌似有两种,一个CCITT-16 ,一个CRC-16 ,不记得了。
网上有一个是多项式查表的,可以自己去搜。和你上边的类似。
下面这个是RFC文献里提供的,自己慢慢琢磨把。
///form www.RFC.net /RFC1071.html //IP校验和算法。16bit ,
unsigned short CRC16(unsigned char* addr,unsigned count) //the param add by
{
/* Compute Internet Checksum for "count " bytes
* beginning at location "addr ".
*/
register long sum = 0;
while( count > 1 ) {
/* This is the inner loop */
//sum += * (unsigned short) addr++; //原文
sum+= *addr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (unsigned char *) addr;
/* Fold 32-bit sum to 16 bits */
while (sum> > 16)
sum = (sum & 0xffff) + (sum > > 16);
return ~sum;
}