网上的有关CRC的原理和代码实现的文章,数不胜数,但比较全的好像还没看到;此文是集百家之智慧,加之自己的使用经验和理解汇聚此文,让你快速理解和使用CRC,当然不足之处欢迎评论区吐槽。

1. CRC是什么 ?

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
---- 来自百度百科

哦,他是生成一段数据包校验码的一种算法,用于发送和接收方的数据校验,减少数据帧出错概率;

那他的实现算法是什么样的,有统一的官方标准吗,还是有百花齐放? 有,有官方的算法标准

2. CRC标准算法

官方的标准算法链接还没找到,这里是汇聚网友的智慧,大家发的几乎都是这套,公认的应该就没错了,有找到的欢迎评论区留言。

CRC标准算法模型的几个参数:

  • 宽度(width):校验码所占的比特位,比如我们常说的CRC16,宽度就是16;
  • 多项式(poly):参与计算的一个常量数值;
  • 初始值(init):开始计算时,CRC的预设数值;
  • 是否翻转(ref):输入或输出数据的比特位顺序是否翻转,比如0x55翻转为0xAA;
  • XOROUT:常量数值,输出结果与此数值异或得到最终结果,为0时,无需异或;

可见如果发送数据和接收数据是两个代码组件,不同的工程师在写,CRC的算法模型参数还要沟通使用一致哦

常见CRC标准算法模型参数表

名称多项式(poly)初始值(init)是否翻转(ref)XOROUTCRC16_CCITTX^16+X^12+X^5+1 (0x1021)0x0000true0x0000CRC16_CCITT_FALSEX^16+X^12+X^5+1 (0x1021)0xFFFFfalse0x0000CRC16_MODBUSX^16+X^15+X^2+1 (0x8005)0xFFFFtrue0x0000CRC16_XMODEMX^16+X^12+X^5+1 (0x1021)0x0000false0x0000

这里的多项式X^16+X^12+X^5+1怎么转成0x1021的呢,(1 << 16) | (1 << 12) | (1 << 5) | 1 = 0x1021

3. CRC16标准算法 C代码实现

这里说明一种通用统一的实现方法,所有的算法模型按上述参数都可以使用此函数实现;

​
static void invert_uint8(unsigned char *dstBuf, unsigned char *srcBuf)
{unsigned char i,tmp = 0;for ( i = 0; i < 8; i++){if (srcBuf[0] & (1 << i)){tmp |= 1 << (7-i);}}*dstBuf = tmp;
}
​
static void invert_uint16(unsigned short *dstBuf, unsigned short *srcBuf)
{unsigned short i,tmp = 0;for ( i = 0; i < 16; i++){if (srcBuf[0] & (1 << i)){tmp |= 1 << (15-i);}}*dstBuf = tmp;
}
​
/****************************************************************** @Function: iot_calculate_crc16* @Description: 计算CRC16值的算法实现,适配所有CRC16的协议* @Param: ref_flag,数据位序翻转,true-低位在前,高位在后* @Return: void*****************************************************************/
unsigned short iot_calculate_crc16(unsigned char *data,unsigned int size,const unsigned short crc_poly,unsigned short init_value,unsigned char ref_flag)
{    unsigned short crc_reg = init_value,tmp = 0;unsigned char j,byte = 0;while (size--){byte = *(data++);if (ref_flag)invert_uint8(&byte,&byte);crc_reg ^= byte << 8;for ( j = 0; j < 8; j++){tmp = crc_reg & 0x8000;crc_reg <<= 1;if (tmp)crc_reg ^= crc_poly;}}if (ref_flag)invert_uint16(&crc_reg,&crc_reg);// 这里XOROUT数值固定为0x0000return crc_reg;  // 等价于 return (crc_reg ^ 0X0000);
}
// 按CRC所用协议直接调用如下宏函数即可,这里只列出部分常用的
#define IOT_CRC16_CCITT_FALSE(data,size) iot_calculate_crc16(data,size,0x1021,0xFFFF,0)
#define IOT_CRC16_CCITT(data,size) iot_calculate_crc16(data,size,0x1021,0x0000,1)
#define IOT_CRC16_MODBUS(data,size) iot_calculate_crc16(data,size,0x8005,0xFFFF,1)
#define IOT_CRC16_XMODEM(data,size) iot_calculate_crc16(data,size,0x1021,0x0000,0)
#define IOT_CRC16_YMODEM(data,size) iot_calculate_crc16(data,size,0x1021,0x0000,0)

看了上述CRC16的,CRC32的实现应该也就很清晰了吧

好了,本文就写到这里,希望对你的项目有些帮助,后面(二)将分享CRC校验码的碰撞概率如何,分享之前大可以放心使用,比和校验的碰撞概率肯定低得多。

协议crc计算_CRC校验原理及代码实现(一)相关推荐

  1. CRC 计算及校验原理

    第一步 给定要发送的数据码 原数据码 =10110011 第二步 根据给定的生成多项式,确定除数码, 除数码 = 11001 第三步 根据生成多项式的最高阶次幂(此处为4),在数据码后补 4个0 新数 ...

  2. java crc计算_JavaCRC校验原理

    一.基本原理 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列:附加在数据序列之后的这个检验码与数据序列的内容之间存在着 ...

  3. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释

    CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注 ...

  4. can协议crc计算_基于CAN总线的CRC校验码的原理与实现

    基于CAN总线的CRC校验码的原理与实现 王鹏 [摘 要]CAN总线又称为控制器局域网技术,属于工业现场总线,应用范围很广.CAN系统中通常 采用反馈重发机制对通信过程进行差错控制.当接收端反馈给发送 ...

  5. can协议crc计算_CAN总线通信的CRC校验方法

    数据校验是为保证数据的完整性进行的一种验证操作.CAN通信采用CRC校验作为一种重要的错误检测手段,是节点判断CAN帧信息的完整性并产生确认应答的依据. 在现场总线通信和控制的实际应用中,工业应用环境 ...

  6. tcp中的crc检验算法原理_CRC校验原理及其实现

    原文作者:王超的独立博客 出处:http://www.wangchaochao.top/2020/09/20/Principle-and-implementation-of-CRC/ 前言 最近的工作 ...

  7. CRC校验原理及代码

    参考:CRC校验原理及步骤https://blog.csdn.net/d_leo/article/details/73572373 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的 ...

  8. can协议crc计算_详解CAN/CAN FD通信中的循环冗余校验(CRC)方法

    数据校验是为保证数据的完整性进行的一种验证操作.CAN通信采用CRC校验作为一种重要的错误检测手段,是节点判断CAN帧信息的完整性并产生确认应答的依据. 在现场总线通信和控制的实际应用中,工业应用环境 ...

  9. bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定

    目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一 ...

最新文章

  1. HTML5 script元素async,defer异步加载
  2. 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
  3. 工作之后如何高效的学习?
  4. Software--Architecture--SOA Factory
  5. 台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning
  6. wininet InternetOpen\InternetOpenUrl\InternetReadFile 等
  7. 每日涉猎技术点存档(2018年6月)
  8. 谷歌浏览器(1) : 主题
  9. Win10系统修改开机密码
  10. 传奇服务器端地图链接在哪个文件夹,传奇服务端目录文件详细说明
  11. 你应该问面试官的10个相关问题
  12. FFMPEG框架学习——(2)视频的提取和解码
  13. UVM中uvm_sequencer的方法总结
  14. 制作京东首页右侧固定层练习
  15. Zooming Slow-Mo: Fast and Accurate One-Stage Space-Time Video Super-Resolution---视频超分辨代码调试总结
  16. yolo3+python3.6
  17. [Pytorch] ValueError: sampler option is mutually exclusive with shuffle
  18. 【转】unbuntu 12.10/13.04 安装ibus中文输入法 及解决无法显示首选项bug
  19. 关于PDF加密的算法【PDFium笔记】
  20. 【python】纸箱抽奖

热门文章

  1. web使用高德完成地图定位_如何在您的Web设计服务中定位-以及何时应该使用
  2. Win10家庭版添加组策略gpedit.msc的办法
  3. 2022-2-18 两地调度
  4. java excel 多sheet页_java导入excel操作多sheet页上传
  5. 代友招人────3D 客户端程序员
  6. 宽带放大器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. 基于JVMTI 实现性能监控
  8. Linux7安装系统服务,CentOs7 安装Tengine 并设置成系统服务,开机自动启动。
  9. 有关IM,QQ协议,QQ机器人
  10. javaee互联网轻量级框架整合开发_整合MyBatis的关键点及快速入门