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[256];

static void CRC32TableCreate(void)
{
    unsigned int c;
    unsigned int i, j;

    for (i = 0; i < 256; i++) {
        c = (unsigned int)i;
        for (j = 0; j < 8; j++) {
            if (c & 1)
                c = 0xedb88320L ^ (c >> 1);
            else
                c = c >> 1;
        }
        CRC32Table[i] = c;
    }

}
static unsigned int CRC32Calculate(void *pBuf ,unsigned pBufSize)
{
    unsigned int retCRCValue=0xffffffff;
    unsigned char *pData;
    pData=(unsigned char *)pBuf;
     while(pBufSize--)
     {
         retCRCValue=CRC32Table[(retCRCValue ^ *pData++) & 0xFF]^ (retCRCValue >> 8);
     }
     return retCRCValue^0xffffffff;
}
static unsigned char CRC8Calculate(void *pBuf ,unsigned pBufSize)
{
    unsigned char retCRCValue=0x00;
    unsigned char *pData;
    int i=0;
    unsigned char pDataBuf=0;
  //  retCRCValue=0x01;
    pData=(unsigned char *)pBuf;
   // pDataBuf=pData[0];
   // cout<<hex<<pDataBuf<<endl;

     while(pBufSize--)
     {
         pDataBuf=*pData++;
         for(i=0;i<8;i++)
         {
             if((retCRCValue^(pDataBuf))&0x01)
             {

                 retCRCValue^=0x18;
                 retCRCValue>>=1;
                 retCRCValue|=0x80;
             //    printf("i=%d;retCRCValue=%x\n",i,retCRCValue);
             }
             else
             {
                   retCRCValue>>=1;
             //     printf("i=%d;retCRCValue=%x\n",i,retCRCValue);
             }
            pDataBuf>>=1;
         }

     }
     return retCRCValue;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    unsigned char Num[9]={'1','2','3','4','5','6','7','8','9'};
     CRC32TableCreate();
    cout<<"CRCCalculatValue:"<<hex<<CRC32Calculate(Num,9)<<endl;
    printf("CRCCalculatValue:%x\n",CRC8Calculate(Num,9));
    return a.exec();
}

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值