CRC校验(1):CRC原理、计算例子和最优多项式的选择

news2024/11/25 9:59:54

CRC(Cyclic Redundancy Check),即循环冗余校验,它通过计算生成固定长度的校验码,用于验证数据在传输过程中是否发生了错误或损坏,从而确保数据的完整性。假设我们想把小写字母z发送出去。在Unicode中,z由数字0x7A表示,二进制为0111 1010。为了使接收方能够验证数据在传输时有没有被修改,我们计算出该数据的CRC为1000,并附加到我们的消息之后:0111 1010 1000。这个校验值1000被称为冗余,因为它是在原来数据的基础上增加的。

文章目录

  • 1 CRC计算
    • 1.1 多项式
    • 1.2 模二除法计算及例子
    • 1.3 CRC类型
  • 2 多项式的选择
  • 3 总结

1 CRC计算

1.1 多项式

从数学上讲,CRC是数据的模二多项式(polynomial)除法的余数。因此,CRC可以写成

CRC = data % 2 polynomial

该多项式可以是任何数学多项式(没有任何系数),但是它的最高指数不能超过CRC的位数。比如我们要生成一个8位CRC,那么多项式的最高指数也必须是8,比如: x 8 + x 2 + x + 1 x^8+x^2+x+1 x8+x2+x+1。而多项式都可以转换成二进制来表示,实际上就是看从每个指数是否存在,存在则为1,不存在则为0。比如说 x 8 + x 2 + x + 1 x^8+x^2+x+1 x8+x2+x+1转换成二进制为100000111

  • 选择不同的多项式将导致相同数据产生不同的CRC。所以发送方和接收方需要使用共同的多项式
  • 对于CRC来说,根据具体的使用场景,有些多项式比其他多项式更适合使用。例如,某些多项式可能更容易检测出连续位错误或交替位错误。

接下来,为了能够计算CRC,我们需要了解模二除法。

1.2 模二除法计算及例子

(1)模二运算
模二运算是对二进制数逐位进行的运算。在这种运算中,不存在进位或借位,每个位被视为独立于其相邻位的数字。实际上就是C语言中的异或运算:

bit1bit2XOR
000
011
101
110

(2)模二除法
模二除法的执行类似于算术除法,唯一的区别是我们使用模二减法(XOR)而不是算术减法来计算每一步的余数。假设被除数为111101,除数为1101,下面来看一下如何计算出CRC:

  1. 计算除数的长度为为L,这里为4。
  2. 在被除数的后面加上L-1位,这里为3,这也是CRC的长度。注意:除数的最高位必须为1,附加的位数就对应二项式中的最高指数: x 3 + x 2 + 1 x^3+x^2+1 x3+x2+1
  3. 用二进制模二进行计算,得到的余数即CRC的结果:001

在这里插入图片描述

1.3 CRC类型

CRC类型由其位大小命名。常见的有:CRC-8、CRC-16、CRC-32、CRC-64和CRC-1(奇偶校验位的特例)。显然对于同一个类型,不同的多项式也有不同的结果。比如对于被除数01000001来说,它的CRC-8在不同的多项式下的结果如下:

二进制多项式CRC-8
11010011111001100
10000011111000000
10100100101100110
11101010101001000
  • 以上是在蓝牙、GSM-B等不同应用中使用的标准CRC-8多项式

2 多项式的选择

我们应该如何选择合适的CRC和相应的多项式?有三个方面需要考虑:随机错误检测精度、突发错误检测精度和冗余系数。
(1)随机错误检测精度
随机错误是指在数据中随机出现的错误。例如,在传输数据时,单个比特被翻转,或者在传输过程中丢失几个比特。根据我们使用的CRC的位大小,我们可以检测到大多数这些随机错误。然而,对于CRC-n来说,这些错误的 1 / 2 n 1/2^n 1/2n不能被检测到。下表显示了每种CRC类型未检测到错误的百分比:

CRC不可检测错误百分比%
CRC-8 1 / 2 8 1/2^8 1/280.39
CRC-16 1 / 2 16 1/2^{16} 1/2160.0015
CRC-32 1 / 2 32 1/2^{32} 1/2320.00000002
CRC-64 1 / 2 64 1/2^{64} 1/264 5.4 × 1 0 − 20 5.4×10^{-20} 5.4×1020

(2)突发错误检测精度
数据传输中的错误通常不是随机的,而是连续的出现几个位的错误,这种错误称为突发错误,它是数据通信中最常见的错误。
CRC-n可以检测最大长度为n位的单突发错误。然而,这在很大程度上取决于用于计算CRC的多项式。有些多项式能够检测到传输数据中的多个突发错误。

CRC突发差错检测
CRC-8至少出现一个连续的错误突发,但这个长度≤8位
CRC-16至少出现一个连续的错误突发,但这个长度≤16位
CRC-32至少出现一个连续的错误突发,但这个长度≤32位
CRC-64至少出现一个连续的错误突发,但这个长度≤64位

(3)冗余系数
使用CRC进行错误检测的代价是要增加额外的数据。比如CRC-32要比CRC-16多传输两个额外的字节。显然,比特位数较低的CRC只需要计算和存储更少的位数。

基于这三个因素,我们可以决定选择哪种CRC类型用于我们的应用程序。然而,CRC多项式也会影响错误检测的效率和质量。如果要深入研究的话,将是一个很复杂的话题,本文不做研究。幸运的是,网上有很多种用于特定CRC类型的标准多项式,在大多数情况下,使用其中之一就能有不错的检错效果

3 总结

CRC校验在做项目的过程中经常会使用到,在我上大学的时候有浅浅地理解这个计算的过程,后面工作了就是直接用NXP SDK中写的软件CRC的代码。说实话,我看不懂这简简单单的几行CRC-32查表算法,但我不希望我只是会用这些函数,而是要理解其中的原理。所以我开始写这一系列的博客深入地研究和理解常见的一些算法,希望能有所收获。

对于现在的CPU来说,大多都在硬件上实现了CRC校验,但我想从软件上来实现CRC32的查表算法,包括表格的生成和CRC的计算。另外,CRC一般有两种:反射CRC和非反射CRC,这两种方式在实际应用中并没有明显的性能或准确性差异,选择哪种方式主要取决于应用的需求和标准。但这些也都需要考虑到,在后面的文章中我都将一一详细地讲解并实现…

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

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

相关文章

这有可能是国内最有趣的大学生知识交流社区了吧?

WRITE-BUG数字空间(http://www.writebug.com)内测 WRITE-BUG创建于2019年,创始团队主要来自于清华大学、中国人民大学等国内高校学生。运营至今,已累积100000注册用户,91%是18-24岁在校大学生,覆盖国内绝大…

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条 进度条 弧形进度条 圆形进度条 词云图&#xff0c; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13029 效果图如下: #### 使用方法 使用方法 <!-- 关键字 --> &l…

java设计模式之:代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额…

注意力机制和Transformer

注意力机制和Transformer 机器翻译是NLP领域中最重要的问题之一&#xff0c;也是Google翻译等工具的基础。传统的RNN方法使用两个循环网络实现序列到序列的转换&#xff0c;其中一个网络&#xff08;编码器&#xff09;将输入序列转换为隐藏状态&#xff0c;而另一个网络&…

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题 1、背景2、解决办法3、补充说明 1、背景 探测器很奇怪的叫法&#xff0c;其实就是相机。 大家在安防领域&#xff0c;智慧工厂&#xff0c;智慧学校、智慧工地等经常会看到海康、大华的网络摄像头&#xff0c; 这些摄像…

软考高级架构师笔记-7信息安全

目录 1. 前言 & 考情分析2. 信息安全1. 信安基础知识2. 信息安全系统的组成框架3. 信息安全技术4. 信息安全的抗攻击技术5. 信息安全的保证体系和评估方法3. 网络安全4. 网络安全协议1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记…

集成测试总结

集成测试 基本概念&#xff1a;将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试&#xff0c;一般来说是以模块和子系统为单位进行测试。 集成测试包含的层次&#xff1a; 模块内的集成&#xff0c;主要是测…

【编译、链接、装载六】汇编——目标文件

【编译和链接六】汇编——目标文件 一、目标文件_存储格式1、生成目标文件2、目标文件存储格式3、file查看文件格式 二、查看目标文件的内部结构——objdump三、代码段四、 数据段和只读数据段五、 ELF文件结构描述1、头文件2、段表2.1、重定位表2.2、字符串表2.3、查看重定位表…

信号完整性:反射 初步认识

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化&#xff0c;只要互连线的阻抗不连续的点&#xff0c;该处就会发生反射。 信号是以电磁波的形式在走线中传播的&#xff0c;如果从传统的电路理论角度去看&#xff0c;是无…

ZipList(压缩链表)

基本概述 ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。 基本结构&#xff1a; 各部分所占字节、基本介绍&#xff1a; entry&#xff0c;节点占用字节不固定&#xff0…

计算机图形学与opengl C++版 学习笔记 第9章 天空和背景

目录 9.1 天空盒9.2 天空穹顶9.3 实现天空盒9.3.1 从头开始构建天空盒9.3.2 使用OpenGL立方体贴图 9.4 环境贴图补充说明 对于室外3D场景&#xff0c;通常可以通过在地平线上创造一些逼真的效果&#xff0c;来增强其真实感。当我们极目远眺&#xff0c;目光越过附近的建筑和森林…

【认知提升思维篇】之 心智模式--人类的行为纪元

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;普本…

国产FPGA:替代ATLERAEP4CE10E22的AG10KL144

背景 AG10K用于PIN TO PIN替代ATLERA EP4CE10E22、EP3C10E144的FPGA&#xff0c;其资源介绍如下&#xff1a; 引脚对应如下&#xff1a; 一般Quartus II开发方式 新建工程 FPGA使用Quartus II开发&#xff0c;开发的整体流程如下&#xff1a; 新建工程时选用Cyclone II…

Liunx系统重修二【常用指令】

LIunx主要做服务器端的操作系统&#xff0c;不会做PC端操作系统的原因是因为&#xff1a; 第一图形化不好&#xff0c;第二软件生态不强&#xff01; 在Liunx系统中都是使用命令来操作&#xff01; Liunx系统中常用的指令并不多&#xff01;一天就可以学完&#xff01; 6&…

chatgpt赋能python:Python如何将图片文件上传至服务器

Python如何将图片文件上传至服务器 在现代网站设计中&#xff0c;图片的使用非常重要&#xff0c;因此将图片文件上传至服务器是一个很常见的操作。Python是一种广泛使用的编程语言&#xff0c;其拥有强大的图像处理能力&#xff0c;并提供了丰富的库来实现文件的上传和下载。…

【SCADA】KingSCADA实现小车移动控制

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 在做SCADA项目时&#xff0c;时常会涉及到控制小车运动的情况&#xff0c;今天通过样例演示在KingSCADA中实现小车移动控制。 一、界面设计及效果演示 1、主画面 以下为测试样例的简单界面。 2、效果展示 当点击…

【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】

【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】 &#x1f53b; 一、安装前规划&#x1f53b; 二、安装前准备一&#xff08;系统参数修改&#xff09;⛳ 2.1 内核版本、系统版本查看⛳ 2.2 修改主机名-重启生效⛳ 2.3 关闭selinux⛳ 2.4 防火墙设置1521端口开放⛳ 2.5…

安全测试工具OWASP ZAP下载

下载 owasp作为一个开源免费的安全测试工具&#xff0c;集成了各种工具的渗透测试框架&#xff0c;还是非常不错滴&#xff0c;安装步骤就放在这啦 1.下载地址&#xff1a; https://www.zaproxy.org/download/ 2.进入后根据自己电脑系统自行下载 3.下载完成后&#xff0c;解压…

【OpenMMLab AI实战营二期笔记】第八天 语义分割与MMSegmentation

1.什么是语义分割 1.1 任务&#xff1a; 将图像按照物体的类别分割成不同的区域&#xff0c;相当于对每个像素进行分类。 1.2 应用&#xff1a; 无人驾驶汽车 人像分割 实时替换视频背景 智能遥感 分辨地表物体的类别&#xff0c;通过右侧分割之后的图像可以看到&#x…

高性能服务器-I/O多路复用(epoll)

系列文章目录 第一章 高性能服务器技术栈 (select) 第二章 高性能服务器技术栈 (epool/poll) 文章目录 系列文章目录前言一、epoll 接口二、epoll 原理三、epoll 触发方式四、设置阻塞方式代码 实例总结参考 前言 在网络中实现IO多路复用的技术&#xff0c;最常用的就是(sele…