网游活动情报网 - 新服预约与福利指南

学习笔记——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供大家参考,我写的其实很烂,但是实现了基本功能,就拿出来抛转引玉