Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170353
  • 博文数量: 13
  • 博客积分: 2123
  • 博客等级: 大尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-05 20:25
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(4)

2009年(5)

2008年(3)

我的朋友

分类:

2010-03-22 14:01:40

unsigned int CRC_16(unsigned char *buf,unsigned char len)
{
 const unsigned int crc_gen = 0xa001;  /*1,1000,0000,0000,0101B*/
 unsigned int crc;
 unsigned char i,j;

 crc = 0xffff;
 if (len != 0)
 {
  for(i = 0;i < len;i++)
  {
   crc ^= (unsigned int)(buf[i]);
   for(j = 0;j < 8;j++)
   {
    if (crc & 0x01)
    {
     crc >>= 1;
     crc ^= crc_gen;
    }
    else
     crc >>= 1;
   }
  }
 }

 return crc;
} // end crc_16

 

 

CRC-16的计算方法:

 

1、  16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器。

2、  把一个8位数据与16CRC寄存器的低位相异或,把结果放于CRC寄存器。

3、  把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)

4、  如果最低位为0:复第3(再次移位)

如果最低位为1CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或。

5、  重复步骤34,直到右移8次,这样整个8位数据全部进行了处理。

6、  重复步骤2到步骤5,进行下一个8位的处理。

最后得到的CRC寄存器即为CRC码,低字节在前,高字节在后。

 

 

阅读(1520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~