天天看點

CRC32和CRC8校驗代碼,C語言版

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();
}

           

繼續閱讀