CRC32使用的是查表法,CRC8使用的是按位計算法,在QT5.5.1下實作了代碼,但是可以移植到其它平台同樣可以運作。
CRC32
使用的CRC-32:
參數模型:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
多項式(hex):04C11DB7
計算CRC初始值(hex): FFFFFFFF
計算結果異或值(hex): FFFFFFFF
輸入Ascii:123456789
結果(hex):CBF43926
CRC8
使用的CRC-8/MAXIM:
參數模型: x8+x5+x4+1
多項式(hex):31
計算CRC初始值(hex):00
計算結果異或值(hex): 00
輸入Ascii:123456789
結果(hex):A1
參考計算網頁:CRC(循環備援校驗)線上計算
#include <QCoreApplication>
#include <iostream>
using namespace std;
unsigned long CRC32Table[];
static void CRC32TableCreate(void)
{
unsigned int c;
unsigned int i, j;
for (i = ; i < ; i++) {
c = (unsigned int)i;
for (j = ; j < ; j++) {
if (c & )
c = L ^ (c >> );
else
c = c >> ;
}
CRC32Table[i] = c;
}
}
static unsigned int CRC32Calculate(void *pBuf ,unsigned pBufSize)
{
unsigned int retCRCValue=;
unsigned char *pData;
pData=(unsigned char *)pBuf;
while(pBufSize--)
{
retCRCValue=CRC32Table[(retCRCValue ^ *pData++) & ]^ (retCRCValue >> );
}
return retCRCValue^;
}
static unsigned char CRC8Calculate(void *pBuf ,unsigned pBufSize)
{
unsigned char retCRCValue=;
unsigned char *pData;
int i=;
unsigned char pDataBuf=;
// retCRCValue=0x01;
pData=(unsigned char *)pBuf;
// pDataBuf=pData[0];
// cout<<hex<<pDataBuf<<endl;
while(pBufSize--)
{
pDataBuf=*pData++;
for(i=;i<;i++)
{
if((retCRCValue^(pDataBuf))&)
{
retCRCValue^=;
retCRCValue>>=;
retCRCValue|=;
// printf("i=%d;retCRCValue=%x\n",i,retCRCValue);
}
else
{
retCRCValue>>=;
// printf("i=%d;retCRCValue=%x\n",i,retCRCValue);
}
pDataBuf>>=;
}
}
return retCRCValue;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
unsigned char Num[]={'1','2','3','4','5','6','7','8','9'};
CRC32TableCreate();
cout<<"CRCCalculatValue:"<<hex<<CRC32Calculate(Num,)<<endl;
printf("CRCCalculatValue:%x\n",CRC8Calculate(Num,));
return a.exec();
}