CRC8,CRC16常见几个标准的算法及C语言实现

CRC8,CRC16常见几个标准的算法及C语言实现,第1张

概述本文章向大家介绍CRC8,CRC16常见几个标准算法及C语言实现,主要包括CRC8,CRC16常见几个标准的算法及C语言实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

参考网址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;


  for(i=0;i

  {


    if((i % 8) == 0)


      data = (*buf++)<<8;


    val = shift ^ data;


    shift = shift<<1;


    data = data <<1;


    if(val&0x8000)


      shift = shift ^ poly16;


  }


  return shift;


}


算法3:


CRC16的算法原理:1.根据CRC16的标准选择初值CRCIn的值。2.将数据的第一个字节与CRCIn高8位异或。3.判断最高位,若该位为 0 左移一位,若为 1 左移一位再与多项式Hex码异或。4.重复3直至8位全部移位计算结束。5.重复将所有输入数据 *** 作完成以上步骤,所得16位数即16位CRC校验码。


根据算法原理与标准要求就能简单的写出具体程序:


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语言实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1264539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存