//CRC高位字节值表
const uint8_t auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40
};
//CRC 低位字节值表
const uint8_t auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
0x41, 0x81, 0x80, 0x40
};
//获得CRC16值
//puchMsg:要校验的数组
//usDataLen:数组长度
//初始值0XFFFF,异或值0x0000,LSB First,多项式8005
uint16_t Get_Crc16(uint8_t *puchMsg, uint16_t usDataLen)
{
    uint8_t uchCRCHi = 0xFF;     //高CRC 字节初始化
    uint8_t uchCRCLo = 0xFF;     //低CRC 字节初始化 
    uint32_t uIndex;         //CRC 循环中的索引
    while (usDataLen--)     //传输消息缓冲区
    {
        uIndex = uchCRCHi ^ *puchMsg++; //计算CRC 
        uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
        uchCRCLo = auchCRCLo[uIndex];
        //        uchCRCLo=uchCRCHi^auchCRCHi[uIndex];
        //        uchCRCHi=auchCRCLo[uIndex];
    }
    return (uchCRCHi << 8 | uchCRCLo);
}
//CRC8校验
//ptr:要校验的数组
//len:数组长度
//返回值:CRC8码
//多项式0X31,LSB First,初始值0X00
uint8_t Get_Crc8(uint8_t *ptr, uint16_t len)
{
    uint8_t crc;
    uint8_t i;
    crc = 0;
    while (len--)
    {
        crc ^= *ptr++;
        for (i = 0; i < 8; i++)
        {
            if (crc & 0x01)crc = (crc >> 1) ^ 0x8C;
            else crc >>= 1;
        }
    }
    return crc;
}
//获得CRC16值
//puchMsg:要校验的数组
//usDataLen:数组长度
//初始值0XFFFF,异或值0x0000,LSB First,多项式A001
uint16_t CRC16(uint8_t* pdata, uint16_t datalen)
{
    uint8_t CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo;
    uint16_t i, Flag;

CRC16Lo = 0xFF;
    CRC16Hi = 0xFF;
    CL = 0x01;
    CH = 0xA0;

for (i = 0; i < datalen; i++)
    {
        CRC16Lo ^= *(pdata + i);
        for (Flag = 0; Flag < 8; Flag++)
        {
            SaveHi = CRC16Hi;
            SaveLo = CRC16Lo;
            CRC16Hi >>= 1;
            CRC16Lo >>= 1;
            if ((SaveHi & 0x01) == 0x01)
                CRC16Lo |= 0x80;
            if ((SaveLo & 0x01) == 0x01)
            {
                CRC16Hi ^= CH;
                CRC16Lo ^= CL;
            }
        }
    }
    return (CRC16Hi << 8) | CRC16Lo;
}

查表法实现CRC16校验相关推荐

  1. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  2. crc16码表的使用_查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  3. VS 2019 MFC CRC16校验算法例程总结(计算法/查表法以及CRC16校验表自动生成)

            工程需要,根据网上例程对CRC16校验方法进行了总结.CRC16为通讯领域常用的校验算法,其原理想必大家都很清楚.下面为相关的总结和封装类代码.被例程将CRC16校验的方法分为及算法和 ...

  4. Modbus-RTU查表法的CRC校验

    目录 一.适用场景 二.CRC表 三.CRC校验程序 一.适用场景 C程序Modbus-RTU的CRC校验. 二.CRC表 uint8_t const CRC_H[] = {0x00, 0xC1, 0 ...

  5. C语言查表法实现CRC-16计算

    文章目录 函数实现 示例代码 运行结果 函数实现 /*16 bit CRC with polynomial x^16+x^12+x^5+1 */ uint16_t crc16_compute(cons ...

  6. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

  7. CRC校验查表法原理及实现(CRC-16)

    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法. 至于查的表是怎么来的,软件为什么要这样实现很多文章并没有说明.本 ...

  8. crc32库 qt_QT实现CRC16校验(查表法)

    近期产品要做认证,那边需要用CRC校验做串口通信的校验方式,就通过两天的时间改了下做模拟.比较了CRC校验的几种方法后发现查表法是最快的. 因为字符一共就256个,所以可以将256个字符的CRC码全部 ...

  9. crc16modbus查表法_CRC16查表法校验,多项式A001,MODBUS的CRC16校验

    本帖最后由 努力的码农 于 2018-5-15 11:43 编辑 最近调试了CRC16的查表法校验,适合上位机走modbus与工业设备相连,采用查表法,速度很快,亲测10000+字节用时不超过1ms, ...

最新文章

  1. python创建scrapy_Python爬虫教程-31-创建 Scrapy 爬虫框架项目
  2. ​别再用方括号在Python中获取字典的值,试试这个方法
  3. okhttp 工具类_HR常用的人才测评工具 ~ 团测系统
  4. Fundebug录屏插件更新至0.4.0,修复BUG,优化性能
  5. [CVPR2016]Learning Deep Feature Representations with Domain Guided Dropout for Person Re-id
  6. 【RHCA翻译计划】EX436第一章:集群存储概论2
  7. 饿了么异地双活数据库实战
  8. 001_汽车之家,新浪和360之间的交流
  9. 如何用jquery实现实时监控浏览器宽度
  10. 华为Mate X国行售价曝光,5G网速实测,强悍!
  11. 中文信息处理(六)—— 神经语言模型与词表示(word2vec)
  12. [绍棠] Xcode9无线调试教程
  13. 数据库宿舍管理系统MySQL表_数据库-宿舍管理系统
  14. wunderlist_Wunderlist的6种开源替代品
  15. 只需3步完成,git迁移仓库地址,保留分支和历史记录
  16. 事件冒泡 vs 事件捕获 vs 事件委托 的区别
  17. 从顶点覆盖(Vertex Cover)到碰撞集(Hitting Set)的归约
  18. python使用fpdf创建pdf:写入hello world、嵌入图片
  19. python回车换行怎么不行_python回车不能换行怎么办
  20. 计算机理论导引第三版答案第四章,《计算理论导引》第四章:可判定性-学习笔记 | 诟屍...

热门文章

  1. Linux简介和开发环境
  2. SAP EPIC 银企直连
  3. 腾讯云从业考试试题举例
  4. Vue基于JSON Schema生成表单和数据校验
  5. 亲手撸了一个SpringBoot+Vue的企业级项目(附源码)
  6. 计算机网络子网的特定主机地址,网络基础之IP地址和子网掩码
  7. 写一个算法交换单链表中p所指结点与其后继结点-21算法题
  8. 不卸载升级cmake
  9. 深入浅出了解BPM、BPMN、BPMN2.0
  10. Cordova项目添加android平台失败的问题