CRC校验原理全面解读

目录

  • 1. 简介
  • 2. 原理
    • 2.1 CRC的发送与接收
    • 2.2 CRC校验码的生成
    • 2.3 CRC校验码的校验
  • 3. 拓展问题
    • 3.1 模2除法为什么等同于异或运算?
    • 3.2 为什么除数的位数和被除数补充的位数相差为1?
    • 3.3 为什么CRC校验码不能纠正错误,只能检测错误?
  • 4. 总结

1. 简介

在数字信号的通信中,常常会因各种因素导致传输错误,于是,聪明的科学家以及开发人员便设计,研发出了各种防止传输错误的方法。校验码便是最常见的一种。👍

最常见的校验码是奇偶校验码,仅仅只占一位,便可以根据数据中0或者1的数量对数据提供校验;然而奇偶校验的缺点也很明显,首先,它对错误的检测概率大约只有50%。也就是只有一半的错误它能够检测出来。另外,每传输一个字节都要附加一位校验位,对传输效率的影响很大(奇偶校验很简单,感兴趣的可以自己了解一下,不再赘述)。

奇偶校验优点也很明显,它很简单,因此可以用硬件来实现,这样可以减少软件的负担


CRC(Cyclic Redundancy Check)循环冗余检验,是一种用于检测数据传输中出现错误的校验方法。其特征是信息字段和校验字段的长度可以任意选定。它通过生成一个循环冗余校验码,将校验码附加到待传输的数据中,接收方再根据相同的算法对收到的数据进行校验,如果校验码无误,则可以判定数据传输正确。

CRC校验可以有效地检测传输过程中可能发生的位错误、丢失数据或假包等问题,是一种常用的数据完整性保护方法。其优点是简单高效,并且能够在较低的计算负载下提供较高的校验能力。

需要注意的是,CRC校验不能纠正错误,只能检测错误。在数据传输的场景中,如果发现数据传输存在错误,通常需要重新发送或采取其他的错误处理措施。

2. 原理

CRC能被广泛采用,肯定有其“过人之处”,让我们来看看它的庐山真面目。

2.1 CRC的发送与接收

发送方 给出需要传递的数据(Data),并定义多项式,以多项式得到(n+1)位除数(divisor),对数据的末尾补上n0,作为被除数,用除数去除被除数,得到的余数就是所需要计算的n位CRC校验码,将得到的CRC校验码拼接到原始数据的末端生成新的数据,将这个数据一并传给接收方。

接收方 将得到的一整块数据作为被除数,用在发送方得到的除数去除被除数,如果结果余数为0的话,代表数据的传输没有出错,得到的数据是正确且有效的。反之当前数据有误,将当前数据丢弃,并通知发送方重新发送。

还有另一种方法:发送方分别发送数据和CRC数据,结束方得到数据末尾补n0作为被除数,用多项式除数去除被除数,得到的余数如果作为接收方的CRC校验码,如果接收方得到的CRC数据和发送方发的CRC一致的话,同样也可以证明数据的传输是没有问题的(本文采用第一种方法)。

所谓的发送方和接收方,一般是指参与通信的两个芯片/ 模块。
在这里插入图片描述

2.2 CRC校验码的生成

CRC运算,也就是这种特殊的除法运算,必须要指定个除数,在CRC算法中,这个除数有一个专有名称叫做“生成多项式”。生成多项式的选取是个很有难度的问题,如果选的不好,那么检出错误的概率就会低很多。不过专家早已经考虑到了这个问题,给我们提供了好多个生成多项式可供选择。11001便是其中之一(生成多项式的要求之一就是最高位和最低位必须为1)。

假设我们现在需要传输一个8位二进制数据10110011。我们选择除数为11001,根据计算规则,在被除数后添加40
在这里插入图片描述
可以看到,计算结果为100,为了保证位数,在前面添加一个0,变成了0100,所以要发送的数据=原数据+CRC校验码,也就是101100110100

2.3 CRC校验码的校验

在接收方收到数据(其实是数据与CRC合并后的新数据)后,将其除以我们定义的除数,若结果为0,则说明结果没错,反之当前数据有误,将当前数据丢弃,并通知发送方重新发送。计算过程如下。
在这里插入图片描述
从上述例子来看,余数为0,说明数据传输没有问题。此时可对此次传输的数据做下一步处理,并准备接收新的数据。

3. 拓展问题

3.1 模2除法为什么等同于异或运算?

模2除法与算术除法类似,但每一位除的结果不影响其它位。只需要自己简单模拟一遍便可知道。
分成4中情况:

  • 0-0:这个结果自然是0
  • 1-1:同上,结果为0
  • 0-1:向高位借1,当2用,所以结果为1
  • 1-0:显然,结果为1
数据A0011
数据B1010
异或运算的结果1001

所以,我们可以得出结论,从结果上看,模2除法与异或运算是等同的。

3.2 为什么除数的位数和被除数补充的位数相差为1?

这个问题并不难回答,这和除数,也就是生成多项式的特征有关系,在特征多项式中,最高位和最低位都为1,而除法运算中,每次参与异或运算的两个数,最高位必然都为1(“被减数”最高位为零则位数不够,必须向低位借数值),这样一来,运算的结果/中间结果最高位为0,没有实际意义,所以余数最多也会比除数少1位。

3.3 为什么CRC校验码不能纠正错误,只能检测错误?

  1. CRC校验码是通过需要发送的原数据计算得来的,为了保证通信效率,一般CRC校验码的长度会比原数据短(校验码是“辅助数据”)。但每一位只能表示0和1,且原数据的值分布一般没有规律,所以不可能存在这样的逆变换,使CRC校验码生成原数据。
  2. 即使存在这样的逆变换,又如何保证CRC校验码传输正确呢?

综上所述,CRC校验码不能纠正错误,只能检测错误。且一般情况下,用到CRC校验码的场景,通信速率都很高,所以在检出错误数据的时候,重新传输是一种简单便捷的方法。

4. 总结

CRC校验在CAN通信中用得比较多,对于确保数据传输的准确性起着非常重要的作用。

参考链接(均来自CSDN):

  1. 循环冗余校验(CRC)算法入门引导
  2. CRC校验原理及步骤
  3. 【科普】CRC校验(一)什么是CRC校验?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium? 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 一、什么是Selenium? …

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业(商家)范围内,实行会员制管理能够更好的提升客户的忠诚度,减少客户的流失。完整、精确的会员管理系统,更能提升企业(商家)的实际效益。 蚓链会员管理系统(专业版) 便是这…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示,可能是没有包含头文件 在运行时,报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码:设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…

迭代器模式:相比直接遍历集合数据,使用迭代器有哪些优势?

今天&#xff0c;我们学习另外一种行为型设计模式&#xff0c;迭代器模式。它用来遍历集合对象。不过&#xff0c;很多编程语言都将迭代器作为一个基础的类库&#xff0c;直接提供出来了。在平时开发中&#xff0c;特别是业务开发&#xff0c;我们直接使用即可&#xff0c;很少…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

文章目录 一、简介1、BeanFactoryPostProcessor2、BeanPostProcessor 二、BeanFactoryPostProcessor 源码解析1、BeanDefinitionRegistryPostProcessor 接口实现类的处理流程2、BeanFactoryPostProcessor 接口实现类的处理流程3、总结 三、BeanPostProcessor 源码解析 一、简介…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…

移动端深度学习部署:TFlite

1.TFlite介绍 &#xff08;1&#xff09;TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件&#xff0c;拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

MotionBert论文解读及详细复现教程

MotionBert&#xff1a;统一视角学习人体运动表示 通过学习人体运动表征&#xff0c;论文原作者提出了处理以人为中心的视频任务的统一方法。使用双流时空transformer&#xff08;DSTformer&#xff09;网络实现运动编码器&#xff0c;能够全面、自适应地捕获骨骼关节之间的远…

在php中安装php_xlswriter扩展报错,找不到php_xlswriter.dll

前言&#xff1a;这里已经把下载的php_xlswriter.dll扩展放到了php安装目录的ext目录下&#xff0c;运行php -m还是报错找不到该扩展 原因&#xff1a;下载的扩展是nts的&#xff0c;而安装的php是ts的。查看当前php是nts还是ts&#xff1a; 在PHP中&#xff0c;可以利用phpin…

在线乞讨系统 Docker一键部署

begger乞讨网 在线乞讨 全球要饭系统前端界面后端界面H2 数据库 console运行命令访问信息支付平台 在线乞讨 全球要饭系统 在线乞讨全球要饭项目,支持docker一键部署&#xff0c;支持企业微信通知&#xff0c;支持文案编辑 前端界面 后端界面 H2 数据库 console 运行命令 项…

TCP/IP网络编程 第十六章:关于IO流分离的其他内容

分离I/O流 两次I/O流分离 我们之前通过2种方法分离过IO流&#xff0c;第一种是第十章的“TCPI/O过程&#xff08;Routine&#xff09;分离”。这种方法通过调用fork函数复制出1个文件描述符&#xff0c;以区分输入和输出中使用的文件描述符。虽然文件描述符本身不会根据输入和输…