// 计算8位CRC
#include "stdafx.h"
//---------------------------------------------------------------------
// 计算8位CRC的函数
// 多项式 G(X)=X8+X2+X+1
// 陪集码 0xFF
// CRC初值 0x00
// 字节高位表示多项式高位
// 本函数用于演示计算原理,使用逐位计算,效率较差, 可以用于生成查找表
//---------------------------------------------------------------------
unsigned char CRC_8_bit(unsigned char *pData, int count)
{
unsigned char CRC=0x00;
for(int n = 0; n<=count; ++n )
{
// 处理的字节
unsigned char cData = 0;
if(n < count)
cData = pData[n];
else
cData = 0; // 数据结束
for (int i=0;i <8;i++)
{
// CRC最高位
unsigned char bit = (CRC>>7)&0x01;
// 后续的数据位
CRC = (CRC<<1)|(cData>>7);
cData <<= 1;
// 校验
if(bit != 0)
CRC = CRC^0x07; // 生成多项式为0x07
}
}
return CRC;
}
// 按字节计算CRC8
unsigned char CRC_8_Byte(unsigned char *pData, int count)
{
// 生成查找表
static bool bCrcTableInit = false;
static unsigned char crc8Table[256] = {0};
if(!bCrcTableInit)
{
bCrcTableInit = true;
unsigned char crcB = 0;
for(int i=0; i<0x100; ++i)
{
crcB = i;
crc8Table[i] = CRC_8_bit(&crcB, 1);
}
}
// 查表计算
unsigned char CRC=0x00;
for(int n = 0; n<count; ++n )
{
CRC = crc8Table[CRC] ^ crc8Table[pData[n]];
}
return CRC;
}
unsigned char CRC_8(unsigned char *pData, int count)
{
return 0xFF ^ CRC_8_Byte(pData, count); // 陪集码为0xff
// 也可用
// return 0xFF ^ CRC_8_bit(pData, count);
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char data[] = {0xcb, 0xab, 0xb1, 0xad, 0x00};
unsigned char c = CRC_8(data, sizeof(data)/sizeof(data[0])); // 0x1a
return 0;
}