原文链接:http://blog.csdn.net/zhangqc1985/article/details/2955975
#include <iostream.h>
#include <stdio.h>
typedef unsigned short u_short;
typedef unsigned char u_char;
一。
//data_buf为报文串、data_length为报文串长度、
//crc_key为生成多项式(16位,去除最大位系数1)
//返回两字节校验码
u_short decCRC(u_char *data_buf,int data_length,u_short crc_key)
{
u_short crc=0x0000,data_type=0x0000;
int j=0;
while(data_length>0)
{
data_type=u_short((crc&0xff00)^(*data_buf<<8));
for(j=0;j<8;j++)
{
if(data_type&0x8000)
{
data_type<<=1;
data_type^=crc_key;
}
else
{
data_type<<=1;
}
}
crc<<=8;
crc^=data_type;
data_length--;
data_buf++;
}
return crc;
}
二。效率较高
u_short crc16l(u_char *ptr,u_char len,u_short key) // ptr 为数据指针,len 为数据长度
{
u_char i;
u_short crc=0x0000;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=key;}
else crc<<=1;
if((*ptr&i)!=0) crc^=key;
}
ptr++;
}
return(crc);
}
!反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响 CRC
计算速度,故设反转多项式。!如CRC16 1021的反转多项式是8408
u_short crc16r(u_char *ptr, u_char len,u_short key)
{
unsigned char i;
u_short crc=0x0000;
while(len--!=0)
{
for(i=0x01;i!=0;i <<= 1)
{
if((crc&0x0001)!=0) {crc >>= 1; crc ^= key;}
else crc >>= 1;
if((*ptr&i)!=0) crc ^= key;
}
ptr++;
}
return(crc);
}