• 分享一段crc16校验算法


    分享一段CRC16的算法
    #include
    //CRC初始值 0x1D0F, Poly: 0x1021.

    CRC校验算法核心代码:

    • 输入待校验的字符串,返回CRC16的数值,
    • 输入待校验的字符串+CRC16数值,如果返回值为0,则表示校验码是正确的。
    #define POLY 0x1021 //crc-ccitt mask
    unsigned short SW_CheckCrc16(unsigned short crc, unsigned char *pDataAddr, unsigned short bDataLen) 
    {
        unsigned char WorkData;
        unsigned char bitMask;
        unsigned char NewBit;
    
        while(bDataLen--)
        {
            WorkData = *pDataAddr++;
            for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) 
            {
                //Align test bit with next bit of the message unsigned char, starting with msb.
                NewBit = ((WorkData & bitMask) != 0) ^ ((crc & 0x8000) != 0);
                crc <<= 1;
                if (NewBit) 
                {
                    crc ^= POLY;
                }
            } 
            //for (bitMask = 0x80; bitMask != 0; bitMask >>= 1)
        }
        return crc;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    一个数据包通常由前导码,包头,载荷,校验四部分组成。包头,载荷是需要校验的数据。

    PreambleFrame headerpayloadintegrity checks

    数据包校验程序:以包头的校验结果来校验载荷。

    unsigned short SW_CreateCrc16( unsigned char *pHeaderAddr, unsigned char bHeaderLen, unsigned char *pPayloadAddr, unsigned char bPayloadLen)
    {
        unsigned short crc;
        crc = 0x1D0F;
        crc = SW_CheckCrc16(crc, pHeaderAddr, bHeaderLen);
        //printf("HeaderAddr %d \n",crc);//crc = 0x1D0F;
        crc = SW_CheckCrc16(crc, pPayloadAddr, bPayloadLen);
        //printf("PayloadAddr %x \n",crc);
        return crc;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    写一个主程序来测试上面的CRC16算法:

    int main()
    {
        unsigned char headArray[12] = {0,0,0,0,0,0,0,0,0,0,0x84,0xF9};
        unsigned char payloadArray[10] = {0};
       
    	SW_CreateCrc16(headArray,12,payloadArray,10);
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将程序放在"菜鸟教程"C语言在线编辑器中运行,得到的结果如下。菜鸟教程真的是一个很好的网站。非常值得关注和阅读。
    在这里插入图片描述
    CSDN博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容

  • 相关阅读:
    传统企业如何转型社交电商,泰山众筹的玩法有哪些?
    Eureka服务注册与发现
    终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题
    Qt | 拖放、拖动的使用、将文件拖入使用示例
    传输层 选择性确认 SACK
    代码随想录算法训练营第十四天 |二叉树
    「团队训练赛」ShanDong Multi-University Training #3
    ERC-7401:嵌套 NFT 标准的全新篇章
    搭建SGC实现引文网络节点预测(PyTorch+PyG)
    BUUCTF 金三 1
  • 原文地址:https://blog.csdn.net/qq_42860989/article/details/126000460