学习笔记——CRC的基本原理与实现
文章目录
- 笔记前言
- 一、CRC是什么?
- 二、CRC基本原理
- 1.原理介绍与练习
- 2.CRC-8 示例代码
- 总结
笔记前言
此篇是学习CRC基本原理与实现的个人学习笔记,以备未来自己复习使用,也将自己学习心得分享给大家。
本篇笔记本着不造轮子的思路,为大家和自己提供了相关的优秀文章和视频的链接,并且以一个至少符合我个人的学习路径的方式为大家展开介绍。
一、CRC是什么?
CRC即循环冗余检验(Cyclic Redundancy Check)是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
正如那个不起眼的封面所见,无人机中常用的mavlink协议也采用了CRC作为数据的检验方法。这也是我接触CRC的最直接的原因。
下面给出了3种不同的CRC算法,给大家以直观感受,之后将详细说明。
CRC算法名 | 多项式公式 | 宽度 | 多项式 | 初始值 | 结果异或值 | 输入反转 | 输出反转 |
---|---|---|---|---|---|---|---|
CRC-4/ITU | x4+x+1 | 4 | 0x13 | 0x00 | 0x00 | true | true |
CRC-8 | x8+x2+x+1 | 8 | 0x107 | 0x00 | 0x00 | false | false |
CRC-16/XMODEM | x16+x12+x5+1 | 16 | 0x11021 | 0x0000 | 0x0000 | false | false |
二、CRC基本原理
1.原理介绍与练习
看下面这篇文章时记得边看边跟着文章里的例子一起动笔算一算。
一篇关于CRC原理很不错的博客
OK,看完了吧。觉得还有点懵?没关系,接下来这的直观的视频展示将帮助你很好的消化吸收。
一个关于CRC原理与实现非常棒的视频,强烈推荐!
现在明白了吧!为了巩固一下刚才的学习成果,让我们来做一两道题试试。
一个在线CRC计算器
打开这个在线计算器,选择如上图所示的模型(这大抵是该计算器可选算法里最适合手算的啦)然后输入自己需要检验的数据(hex),自己手算一下与计算器结果对比。
2.CRC-8 示例代码
纸上得来终觉浅,还是建议自己码一下简单的demo亲手实现CRC,这样体会更深刻!
再看代码前,我再说明一下第一部分中CRC算法表头的意思。
- 算法名称:这个就没啥好说的了,就是名字嘛
- 多项式公式:大家看了推荐的第一篇博客内容也肯定知道了,这里不做解释了
- 宽度:就是最后校验码的位长
- 多项式:就是多项式公式对应的值,(这里把最高位给略去了,实际计算中最高位是有的)
- 初始值:就是CRC检验寄存器一开始的值(对应代码就是初始CRC值)
- 结果异或值:就是把数据进行模二除法后得到的结果进行异或的值
- 输入反转:就是把输入的数据进行反转:比如输入11100001,反转后就是10000111。这个的作用主要是数据传输时,一般是从低位传输,所以进行反转的话,我们就不需要把所有数据都得到了才能才是进行检验的计算。
- 输出反转:把计算得出的CRC校验码进行反转
好了,最后附上我的demo供大家参考,我写的其实很烂,但是实现了基本功能,就拿出来抛转引玉了。参考代码如下(注意:每次输入的数字不超一个字节即0xFF):
#include <stdio.h>
#include <stdlib.h>
/* CRC-8 caculation */
//POLY x^8+x^2+x+1 100000111 0x107
//INIT 00
//XOROUT 00
//REFIN false
//REFOUT false
//参考计算网址:http://www.ip33.com/crc.html
//参考文章网址:https://www.cnblogs.com/masonzhang/p/10261855.html https://zhuanlan.zhihu.com/p/81294341
//作者:TLKid 2021-8-20int main()
{int i=0;unsigned char msb;unsigned short int CRC=0x00; // CRC INITunsigned short int XOROUT=0x00; // 结果异或值int len,len2;printf("len:"); scanf("%d",&len); //数据所占的字节长度len2=len;unsigned int data[len];unsigned short int Data[len];unsigned short int *Data_ptr=Data;printf("输入校验数据0x:\n");for(i=0;i<len;i++)scanf("%X",&data[i]);for(i=0;i<len;i++)Data[i]=(unsigned short int)data[i];while(len--){CRC=CRC^(*(Data_ptr++)<<8);/*没错,这就是模2除法的神奇性质。对于一串很长的数据我们可以分段处理。比如这里我们每次只处理了一个字节的数据,然后将其余数与下一个字节数据之首对齐进行进行异或运算。该结果继续进行模2除法,如此循环,最后得出的余数和直接用原数据一次性进行模2除法是一致的。*/for(i=0;i<8;i++){msb=(CRC>>15&0x1); //检查最高位是否为1if(msb==1)//还记得视频里那个激活器么?没错就是它!CRC=CRC^0x8380; //如果是则进行异或运算 高9位100000111B CRC=CRC<<1;//移位}}CRC=(CRC>>8)^XOROUT;printf("CRC(Hex):%X \n \n",CRC);printf("Data(Hex):");for(i=0;i<len2;i++)printf("%X ",Data[i]);return 0;
}
最后,学有余力且好奇心旺盛的小伙伴可以看看这篇文章,讲的很深入!
一篇关于CRC很nice的知乎文章
总结
CRC作为常用的数据检验方法,不求精通其所有细节,但还是要知道其基本原理和计算流程,会用就行。
学习笔记——CRC的基本原理与实现相关推荐
- 软考:软件设计师(中级)--学习笔记02操作系统基本原理
目录 二.操作系统基本原理 2.1进程管理 2.1.1进程的状态 2.1.2前趋图 2.1.3进程的同步与互斥:PV操作的前提 2.1.4 PV操作 2.1.5死锁问题 2.2存储管理 2.2.1页式 ...
- 学习笔记之VoIP基本原理与应用
整理日期: 2005年12月7日 VoIP基本原理与应用 概述 1995年以色列VocalTec公司所推出的Internet Phone,不但是VoIP网络电话的开端,也揭开了电信IP化的序幕.人们从 ...
- STL学习笔记-set的基本原理以及插入、遍历
set 关键字保存:通过实值来排序,再通过实值来查找: 特点:高效访问,与map一样,底层都是红黑树,map是分键值对的,set键值即实值,实值即键值: set的键值不能重复. 红黑树:平衡排序二叉树 ...
- stm32学习笔记——通用计时器基本原理
stm32f10x最多有8个定时器,stm32f103zet6就有8个定时器,分别是4个通用定时器,2个高级定时器,2个基本定时器. 定时器种类 位数 计时器模式 产生DMA请求 捕获 ...
- HCIA-RoutingSwitching华为认证路由交换工程师学习笔记 (1) - 数据通信基本原理及IP地址的规划和设计
企业网络基本架构 扁平化架构(小企业) 优点:节省资源,省钱 缺点:冗余性不足 多层网络结构(大企业) 接入层:将大量终端接入网络中,一定要保证向下接入的端口数量(如边缘端口),主要是保证接入,做很 ...
- Docker学习笔记2 -- Docker的基本命令和使用
目录 Docker学习笔记1 Docker帮助命令 Docker镜像命令 Docker容器命令 Docker commit操作 Docker学习笔记1 Docker学习笔记1 – Docker基本原理 ...
- STM32CubeMX学习笔记(22)——CRC接口使用
一.CRC简介 CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者 ...
- 学习笔记三:MLP基本原理、矩阵求导术推反向传播、激活函数、Xavier
文章目录 一.BP神经网络(MLP) 1.1 感知机模型及其局限性 1.2 BP神经网络基本原理 1.3 softmax多分类.求导 1.4 二分类使用softmax还是sigmoid好? 1.5 为 ...
- 计算机基本原理 学习笔记(八)
本篇目录 接上) 十一.软件工程 1.面向对象编程 2.软件开发工具 十二.集成电路&摩尔定律 1.数字暴政 2.集成电路IC 3.印刷电路板 3.光刻技术 4.摩尔定律 5.技术瓶颈 总结 ...
最新文章
- 电脑安装pandas报错_python3.8下如何解决pandas报错No module named '_bz2'问题
- [转] C#中绘制矢量图形
- VMware CTO:未来VMware NSX与思科ACI将有更多整合
- Golang-简洁的并发
- python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法
- OpenWrite的渠道顺序你说了算!来支持你最喜欢的技术类平台吧!
- 二叉树的基本操作_二叉树的遍历
- snippets vscode 配置_VSCode 利用 Snippets 设置超实用的代码块
- Linux文件I/O编程(二)lseek函数
- 用程序解决所有文件的格式转换
- 【JVM】三色标记法与读写屏障
- 【自爆系列】浅谈我前端开发的那些糗事
- Spring @Aspect、@Before、@After 注解实现 AOP 切面功能
- web开发性能优化---安全篇
- 快逸报表整合至MyEclipse项目中
- Java 分页工具类
- cppcheck支持MISRA C 2012
- Python3.9安装Cartopy使用报错:DLL load failed while importing trace
- 基于Android的减肥塑身平台
- ubuntu系统安装完nvidia显卡驱动后黑屏,不能进入系统