原文链接: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);
}
本文详细介绍了使用C语言实现CRC16校验码的两种方法,包括基本实现和效率优化,涉及数据类型转换、位操作及多项式反转等关键技术。文章深入探讨了多项式反转在数据通讯中的应用,旨在提高CRC计算效率。
&spm=1001.2101.3001.5002&articleId=41821701&d=1&t=3&u=ccdbd537b6c341dc9f36802c200d7cfd)
232

被折叠的 条评论
为什么被折叠?



