CRC校验原理全面解读

news2024/11/25 18:38:08

目录

  • 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.coloradmin.cn/o/771597.html

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

相关文章

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接:二叉树的概念性质 上一篇我们讲了二叉树的结构定义,以及前序/中序/后序的递归遍历,还有一些二叉树的接口实现,本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接:二叉树详…

第108天:免杀对抗-Python混淆算法反序列化打包生成器Py2exeNuitka

知识点 #知识点: 1、Python-对执行代码做文章 2、Python-对shellcode做文章 3、Python-对代码打包器做文章#章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指…

SpringCloud学习路线(7)—— 统一网关Gateway

一、引言 (一)需求: 服务器中的微服务只允许内部人员调用或是内网人员进行调用,拒绝外网人员访问。 (二)如何实现需求? 网关 (三)网关的功能 身份认证和权限校验服务…

十八、Unity游戏引擎入门

1、下载 首先需要下载Unity Hub,下载网址:https://unity.com/cn。 然后在其中下载Unity编辑器并安装,可选择最新版本。 接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制(涉及到HDFS的元数据管理操作)2.4 HDFS中NameNode和DataNode的工作机制&a…

【C++】仿函数(less)

C中的仿函数 class Solution { public:struct cmp{bool operator()(const pair<string,int>&kv1,const pair<string,int>&kv2){if(kv1.second<kv2.second) return true;if(kv1.secondkv2.second&&kv1.first>kv2.first) return true;return …

JavaWeb01-Servlet-thymeleaf-mvd-dispatcher-controller

Servlet: servlet的基本作用 第一个servlet程序&#xff1a; //演示servlet的生命周期 public class Demo02Servlet extends HttpServlet {Overridepublic void init() throws ServletException {System.out.println("正在初始化。。。");}Overrideprotected void …

实例019 以图形按钮显示的界面

实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能&#xff0c;但各有缺点。如果采用按钮式功能菜单&#xff0c;不但美观大方&#xff0c;而且操作灵活。当单击按钮时&#xff0c;用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例&#xff0…

【个人笔记】linux命令之cd

cd命令 cd&#xff08;英文全拼&#xff1a;change directory&#xff09;命令用于改变当前工作目录的命令&#xff0c;切换到指定的路径。 若目录名称省略&#xff0c;则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。 另外&#xff0c;~ 也表示为 home 目录 的…

恢复配置并减少网络停机时间

随着众多公司努力在商业世界中崭露头角&#xff0c;拥有可靠的 IT 基础架构比以往任何时候都更加重要。组织需要维护一个稳定的网络环境&#xff0c;避免不合时宜的网络中断以及网络连接中断、声誉受损、应用程序不可用和数据丢失。 Network Configuration Manager 提供了一种…

Debian 12上如何关闭nobody共享文件夹,一个能让INSCODE AI 创作助手不知所措的小问题

这个问题之前在Debian 10和11上都没有遇到过&#xff0c;换上Debian 12后Samba的设置就出现了状况&#xff0c;装上Samba后什么都没有设置就在局域网可以看到&#xff1a; 根据之前的经验在/etc/samba/smb.conf里查了很久也没有看出所以然来&#xff0c;后来又问了INSCODE AI…

ubuntu打开usb摄像头

文章目录 前言一、识别 usb 摄像头二、安装应用程序显示摄像头捕捉到的视频1、使用应用程序茄子&#xff08;cheese&#xff09;2、运行 cheese 捕捉视频 总结 前言 记录一下解决在 Linux 下打开 usb 摄像头界面黑屏的问题。 一、识别 usb 摄像头 1、保持在 ubuntu 界面&…

软件测试用例的八大步骤你都知道吗?

目录 第一步、UI体验测试 第二步、功能完整性测试 第三步、业务流程测试 第四步、容错机制测试 第五步、常规性测试 第六步、性能测试 第七步、交互体验测试 第八步、兼容性测试 总结&#xff1a; 第一步、UI体验测试 1.风格、样式、颜色是否协调 2. 界面布局是否整齐、…

【网站搭建】3 更换博客主题—butterfly

可以到官网选择想要更换的主题Themes | Hexo 我选用的是butterflyzhangzeli/hexo-theme-butterfly: A Hexo Theme: Butterfly (github.com) 在Hexo根目录打开终端执行拉去操作 下载配套文件 npm install hexo-renderer-pug hexo-renderer-stylus 打开_config.yml文件&#xf…

二维费用背包(既有最大体积限制,又多加了一个最大重量限制)

1:分析状态转移方程式 2:ACcode: #include<bits/stdc.h> using namespace std; const int N1e310; int f[N][N],v[N],w[N],m[N]; void solve() {int a,b,c;cin>>a>>b>>c;for(int i1; i<a; i) cin>>v[i]>>m[i]>>w[i];//酷似01背…

数仓虚拟化技术:PieCloudDB 通过中国信通院 2023 「可信数据库」性能评测的强力支撑...

“可信数据库”是国内首个数据库的评测体系&#xff0c;被业界广泛认可为产品能力重要的衡量标准之一。PieCloudDB 在该评测中展现出卓越的数据处理速度、稳定性和可扩展性&#xff0c;为用户提供了强大的数据分析和查询能力。 6 月 15 ~ 16 日&#xff0c;中国信通院 2023 上…

vue3笔记-脚手架篇

第一章 基础篇 第二章 脚手架篇 vue2与vue3的一些区别 响应式系统&#xff1a; Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听&#xff0c;它对数据监听是一项项的进行监听&#xff0c;因此&#xff0c;当新增属性发生变化时&#xff0c;它无法监测到&…

0719_rasa网站的一些介绍

it’s not a bot, it’s your brand rasa is the leading open generative conversational ai platform for creating and managing ai assistants at scale. learn more talk with sales top enterprises trust rasa american express adobe dell accenture report ho…

使用Canal同步mysql数据到es

一、简介 Canal主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x 二、工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记…

一篇文章带你用Jenkins和Kubernetes搭建DevOps平台

JenkinsKubernetes实现DevOps DevOps 介绍Jenkins环境准备准备JDK下载jdk安装jdk配置jdk环境变量 准备maven下载maven解压maven配置maven配置maven环境变量 安装Docker安装git 安装Jenkins初始化jenkins准备代码仓库和docker镜像仓库准备Kubernetes准备java项目搭建DevOps创建代…