参考网址CRC16常见几个标准的算法及C语言实现
先说一下CRC8的实现方式
CRC校验类型:CRC8/MAXIM
多项式:X8+X5+X4+1
poly:0011 0001 0x31
高位放到后面就变成 1000 1100 0x8c
C现实代码:
unsigned char crc8_chk_value(unsigned char *message,unsigned char len)
{
uint8 crc;
uint8 i;
crc = 0;
while(len--)
{
crc ^= *message++;
for(i = 0;i < 8;i++)
{
if(crc & 0x01)
{
crc = (crc >> 1) ^ 0x8c;
}
else crc >>= 1;
}
}
return crc;
}
这是映射颠倒的校验方式。
算法2
方法1:将存有数据的字节数组进行逐位计算,求得字节形式的CRC
typedef unsigned __int16 INT16U;
#define CRC_SEED 0xFFFF // 该位称为预置值,使用人工算法(长除法)时 需要将除数多项式先与该与职位 异或 ,才能得到最后的除数多项式
#define poly16 0x1021 // 该位为简式书写 实际为0x11021
INT16U crc16(unsigned char *buf,unsigned short length)
{
INT16U shift,data,val;
int i;
shift = CRC_SEED;
{
unsigned short CRC16_CCITT(unsigned char *puchMsg,unsigned int usDataLen)---3个算法中,执行效率最快
{
unsigned short wCRCin = 0x0000;
unsigned short wCpoly = 0x1021;
unsigned char wChar = 0;
while (usDataLen--)
{
wChar = *(puchMsg++);
//InvertUint8(&wChar,&wChar);
wCRCin ^= (wChar << 8);
for(int i = 0;i < 8;i++)
{
if(wCRCin & 0x8000)
wCRCin = (wCRCin << 1) ^ wCpoly;
else
wCRCin = wCRCin << 1;
}
}
//InvertUint16(&wCRCin,&wCRCin);
return (wCRCin) ;
}
voID InvertUint8(unsigned char *dBuf,unsigned char *srcBuf)
{
int i;
unsigned char tmp[4];
tmp[0] = 0;
for(i=0;i< 8;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(7-i);
}
dBuf[0] = tmp[0];
}
算法4
voID CCRCDlg::CRCCCITT(const CHAR* pDataIn,int iLenIn,WORD* pCRCOut)
{
WORD wTemp = 0;
WORD wCRC = 0xffff;
for(int i = 0; i < iLenIn; i++)
{
for(int j = 0; j < 8; j++)
{
wTemp = ((pDataIn[i] << j) & 0x80 ) ^ ((wCRC & 0x8000) >> 8);
wCRC <<= 1;
if(wTemp != 0)
{
wCRC ^= 0x1021;
}
}
}
*pCRCOut = wCRC;
}
voID InvertUint8(unsigned char *dBuf,unsigned char *srcBuf)
{
int i;
unsigned char tmp[4];
tmp[0] = 0;
for(i=0;i< 8;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(7-i);
}
dBuf[0] = tmp[0];
}
voID InvertUint16(unsigned short *dBuf,unsigned short *srcBuf)
{
int i;
unsigned short tmp[4];
tmp[0] = 0;
for(i=0;i< 16;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(15 - i);
}
dBuf[0] = tmp[0];
}
总结以上是内存溢出为你收集整理的CRC8,CRC16常见几个标准的算法及C语言实现全部内容,希望文章能够帮你解决CRC8,CRC16常见几个标准的算法及C语言实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)