CRC16_CCITT_FALSE校验代码 及 验证

简介: CRC16_CCITT_FALSE校验代码 及 验证

标准CRC16

/**
*bufData:指令数据
*buflen:处理的指令长度
*pcrc:处理完之后的CRC码
**/
int get_crc16(unsigned char* bufData, unsigned int buflen)
{
    int ret = 0;
    unsigned short CRC = 0xffff;
    unsigned short POLYNOMIAL = 0xa001;
    int i, j;
    //指令为空
    if (bufData == NULL)
    {
        return -1;
    }
    //校验计算的长度为0
    if (buflen == 0)
    {
        return ret;
    }
    for (i = 0; i < buflen; i++)
    {
        CRC ^= bufData[i];
        //总共八次右移操作
        for (j = 0; j < 8; j++)
        {
            if ((CRC & 0x0001) != 0)
            {
                //右移的移出位为1
                CRC >>= 1;
                CRC ^= POLYNOMIAL;
            }
            else
            {
                //右移的移出位为0
                CRC >>= 1;
            }
        }
    }
    printf("CRC=%X\n", CRC);
    //低位在前,高位在后
    unsigned char* pcrc;
    qDebug() << "pcrc[0] =" <<  (unsigned char)(CRC & 0x00ff);
    qDebug() << "pcrc[1] = " <<(unsigned char)(CRC >> 8);
    return ret;
}
#include <iostream>
unsigned short CRC16_CCITT_FALSE(unsigned char* puchMsg, unsigned int usDataLen)
{
    unsigned short wCRCin = 0xFFFF;
    unsigned short wCPoly = 0x1021;
    unsigned char wChar = 0;
    while (usDataLen--) {
        wChar = *(puchMsg++);
        wCRCin ^= (wChar << 8);
        for (int i = 0; i < 8; i++) {
            if (wCRCin & 0x8000) {
                wCRCin = (wCRCin << 1) ^ wCPoly;
            }
            else {
                wCRCin = wCRCin << 1;
            }
        }
    }
    return (wCRCin);
}
//发送    0xAA , 0x06 , 0x10, 0x01
//接受    42991 (A7EF)
int main()
{
    unsigned char value[] = { 0xAA , 0x06 , 0x10, 0x01 };
    unsigned short result = CRC16_CCITT_FALSE(value, 4);
    std::cout << result;
    return 0;
}


相关文章
|
测试技术
CRC-16 MODBUS原理,附实测可用源码
之前做串口解析,CRC校验一直用和校验,就是吧各个位加在一起,新来一个串口协议,是CRC-16 MODBUS的形式校验,不会呀,从网上找了找资源,没有找到源码,都要下载,分享出来。
CRC-16 MODBUS原理,附实测可用源码
|
存储 安全 算法
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
|
8月前
|
算法 编译器 C语言
【2026最新】MinGW64官网下载安装保姆级教程(附安装包+图文并茂)
MinGW-w64 是 Windows 下的轻量级 GNU 编译器集合,支持 C/C++ 编译,无需虚拟机即可生成独立 exe 文件。它体积小、免安装、静态链接运行库,兼容 Win10/11 与旧系统,配置简单,广泛用于算法开发、刷题及教学场景。
14480 5
|
Ubuntu 定位技术
Ubuntu 20.04应用部署:Beyond Compare 4.4.7安装教程
这样,你就成功在Ubuntu 20.04上安装了Beyond Compare 4.4.7。就像一个探险者,你有了罗盘,有了地图,熟能生巧,你就可以在未知的世界中探索,发现,享受这个过程。这是一次成功的探险,你做得很好!
2313 7
|
算法
LabVIEW编程LabVIEW开发 CRC16-CCITT- False校验 表例程与相关资料
LabVIEW编程LabVIEW开发 CRC16-CCITT- False校验 表例程与相关资料
1102 0
|
传感器 中间件 Windows
04 Windows下mosquitto安装
04 Windows下mosquitto安装
1084 0
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
这篇文章介绍了在Visual Studio Code (VSCode) 中进行离线安装插件的详细步骤,包括如何下载插件、以SVN插件为例的离线安装过程、通过命令行安装以及一个更加简单的离线安装方式,还提供了操作界面的截图帮助理解。
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1167 6