首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

CRC-16校验的有关问题

2012-03-15 
CRC-16校验的问题?首先感谢大家看帖,小弟就这么点家当了,只剩20分不好意思。这两天BOSS发话了,要做一个XMOD

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;
}

热点排行