2.1.5 校验码(一文带你分析搞懂:奇偶校验码、海明码、CRC码)
文章目录:
- 什么是校验码?
- 为什么要有校验码?
- 1.奇偶校验码
- 怎么通过奇偶校验码判断数据是正确还是错误呢?
- (1)奇校验
- (2)偶校验
- 为什么无法检查出偶数个错误?
- 2.海明(汉明)校验码
- 什么是海明校验码?
- 一题搞懂海明码,在信息位 n=4 ,校验位 k=3 时,求 1010 的海明码。
- (1)确定海明码位数
- (2)确定校验位 P~i~ 在海明码中的位置
- (3)分组形成校验关系
- (4)校验位 P~i~ 取值
- (5)海明码的校验原理
- 3.循环冗余校验(CRC)码
- 什么是CRC码?
- 原码如何编码生成CRC码?
- 一题搞懂CRC码生成与校验
- (1)信息码左移R位
- (2)模2除法得余数
- (3)如何检错和纠正错误?
什么是校验码?
- 校验码:指能够
发现
或能够自动纠正错误
的数据编码,也称检错纠错编码。 - 实现原理:通过加一
冗余码
,来检验或纠错编码 - 码距:简单来说就是两个二进制数比较,在同一数位的地方,数位值不同的个数有多少个,即码距,也称海明距离;
- 两种方法计算码距。比如0100和1111
直接观察法
:可以看出,有3个数位值不同,所以码距为3.
异或计算法
:0100⊕1111=1011 ,结果为1011,里面有几个1就代表有多少个数位值不同,即码距是多少,这里码距是3。
为什么要有校验码?
- 其实从什么是校验码,就可以看出为什么要有校验码,在计算机的运算过程中,所有数据都是以二进制保存的,数据在计算机中进行运算处理传递的时候,我们要对数据进行加工,为什么要加工呢?是为了防止在传输过程中由于硬件等方面的因素导致数据发生变化,当我们加工数据增加冗余位后,原始数据码就变成了校验码,我们可以通过相对应的校验码的一些方法来
检测和纠正
错误,保证数据的准确性。
1.奇偶校验码
- 实现原理: 在原编码中加一个校验位,则
原编码就变成了校验码
,它的码距为2,可以检查出奇数位错误,但不能检查出偶数位错误,增加的冗余位为奇偶校验位,一般校验位设置在原编码的最左边或最右边。 - 奇校验码:整个校验码(信息位+校验位)中1的个数位奇数
- 偶校验码:整个校验码(信息位+校验位)中1的个数位偶数
怎么通过奇偶校验码判断数据是正确还是错误呢?
- 首先在计算机中,我们就要约定好,数据是采用奇校验还是偶校验,下面分奇校验和偶校验来说明一下奇偶校验如何检查在计算机传输数据的过程中数据是否正确。
(1)奇校验
- 假设我们的原始编码是
10110111
,因为我们规定计算机采用奇校验
,所以我们在原编码最左边多加了一个校验位,并置为1,那么原编码就变成了奇校验码,有奇数(7)个1。 传输过程中奇数个数据改变
:在传输过程中有奇数个数位值发生了改变
,那么我们通过奇校验运算
,可以发现现在变成了6个1,和奇校验码相比有3个数位值发生了改变,奇校验码不再有奇数个1,而是变成了偶数个1,可以判断我们的数据发生了改变,可以检查出错误。传输过程中有偶数个数据改变
:在传输过程中有偶数个数位值发生了改变
,那么我们通过奇校验运算
,可以发现现在变成了7个1,和原奇校验码7个1一样,都是奇数,这时我们便无法通过奇校验运算判断数据是否发生了改变,即无法检查出偶数个错误
。
(2)偶校验
- 假设我们的原始编码是
10110111
,因为我们规定计算机采用偶校验
,所以我们在原编码最左边多加了一个校验位,并置为0,那么原编码就变成了偶校验码,有偶数(6)个1。 传输过程中奇数个数据改变
:在传输过程中有奇数个数位值发生了改变
,那么我们通过偶校验运算
,可以发现现在变成了5个1,和偶校验码相比有3个数位值发生了改变,偶校验码不再有偶数个1,而是变成了奇数个1,可以判断我们的数据发生了改变,可以检查出错误。传输过程中有偶数个数据改变
:在传输过程中有偶数个数位值发生了改变
,那么我们通过偶校验运算
,可以发现现在变成了6个1,和原偶校验码6个1一样,都是偶数,这时我们便无法通过偶校验运算判断数据是否发生了改变,即无法检查出偶数个错误
。
为什么无法检查出偶数个错误?
- 通过上述奇偶校验两种方式校验数据,可以比较得出奇偶校验可以检测出奇数个错误而无法检查出偶数个错误,也无法纠正错误,无法定位错误位置。
2.海明(汉明)校验码
什么是海明校验码?
- 一种多重奇偶校验码。
- 实现原理:在有效信息位中加入几个校验位形成海明码,并把海明码的每一个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化。
- 特点:可以发现错误,定位错误位置,自动纠正错误。
可以检测双比特错误,但只能纠正单比特错误
。
纠错理论:L-1=D+C且D≥C
编码最小码距L越大,其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于检错能力
一题搞懂海明码,在信息位 n=4 ,校验位 k=3 时,求 1010 的海明码。
(1)确定海明码位数
- 根据公式:2k ≥ n+k+1(若要检测两位错,则需再增加1位校验位,即k+1位)
这个公式记住就行了,就像不知道爱因斯坦相对论公式 E=mc2 一样。
海明码位数n+k=7,公式 23 ≥ n+k+1=8成立,n,k有效。设置变量来表示信息位、校验位、海明码。如图。
(2)确定校验位 Pi 在海明码中的位置
- 规定校验位 pi 在海明位号位 2 i-1 的位置上,所以:
(3)分组形成校验关系
- 每个数据位用多个校验位来检验。
- 必须满足条件:
被校验数据位的海明码位号 = 校验该数据位的各校验位海明位号之和
,比如校验D3,它的海明位号H6为6,那么校验它的校验位为P3和P2,因为他们的海明位号H4和H2加起来等于6。 - 校验位不需要再被校验
- 分组关系如图:
(4)校验位 Pi 取值
- Pi的值 = 第 i 组所有数据位求异或⨁
- P1=D1⨁D2⨁D4=0
- P2=D1⨁D3⨁D4=1
- P3=D2⨁D3⨁D4=0
- 所以 1010 的海明码为:
(5)海明码的校验原理
- 每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,即异或运算⨁,构成k个校验方程。
- S1=P1⨁D1⨁D2⨁D4
- S2=P2⨁D1⨁D3⨁D4
- S3=P3⨁D2⨁D3⨁D4
- 若S1S2S3=000,则说明无错,否则说明出错。这个数的值就是出错的位置,如S1S2S3=001,表示第1位出错,即H1出错,直接将该位取反就可以达到
纠错
的目的。
3.循环冗余校验(CRC)码
什么是CRC码?
- 基本思想:校验码中的一种。在K位信息位后拼接R位检验位,组成CRC码,这种编码也称(N,R)码
- 特点:可以发现错误,定位错误位置,自动纠正错误。
可检测出所有奇数位错,所有双比特的错和所有小于、等于校验位长度的突发错
- 结构:
原码如何编码生成CRC码?
- 首先,发送端和接受端会有一个生成多项式G(x)约定,生成多项式G(x)的最高次幂为
R
。任意一个二进制数码都可用一个系数为0或1的多项式与之对应。比如:二进制数码 1101 对应的G(x)=1*X3+1*X2+0*X1+1*X0= X3+X2+1 - 在发送端,将要传送的K位二进制信息码左移R位,将它与生成多项式G(x)所对应的的二进制数码进行
模2除法
,产生余数,生成一个R位检验码,并附在信息码后,构成一个新的二进制码(CRC)码,共K+R位。
模2运算:分为模2加、模2减、模2乘、模2除,不考虑
进位
和借位
。
一题搞懂CRC码生成与校验
例题: 设生成多项式G(x)=X3+X2+1 ,信息码为 101001 ,求对应的CRC码 。
- 分析:校验位长度:R=3 , 信息码长度:K=6 , CRC码长度:N=R+K= 9
- 生成多项式对应二进制码:1101
(1)信息码左移R位
- 发送端将原信息码左移R位,低位补0:101001 000
(2)模2除法得余数
- 方法:发送端用移位后的信息码 101001000 除以G(x)所对应的二进制数码 1101 求余数,余数除得够就写1,不够就写0,直到余数小于 1101 ,余数即为校验位的数值。
- 图中即为具体计算步骤,得到最后的结果CRC码为:101001 001,然后发送端将CRC码101001 001发送给接收端。
(3)如何检错和纠正错误?
- 接收端收到CRC码后,用生成的CRC码除以生成多项式G(x)所对应的的二进制数码,若余数为0,则信息码在传输过程中没有产生错误,数据正确。
- 若接受到的CRC码为C9C8C7C6C5C4C3C2C1= 101001011,除以G(x)所对应的二进制码1101得到余数为010,不为0,说明数据在传输过程中产生错误。010=2(10)说明C2出错,将C2取反即可纠正错误。
2.1.5 校验码(一文带你分析搞懂:奇偶校验码、海明码、CRC码)相关推荐
- 一文带你彻底搞懂i++和++i的区别,谁的效率更高?
作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦. i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学 ...
- lambda表达式java项目常用_一文带你彻底搞懂Lambda表达式
1. 为什么使用Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- 面试都在问的微服务,一文带你彻底搞懂!
来自:后端技术学堂 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程序」( Monolithic application ),单体式应用内部包含了所有需要的服务.而且各个服务功能模块有很 ...
- 一文带你你搞懂索引如何优化!!!
前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率? 此篇文章详细的讲述了索引优化的几个原则,只要在工作中能够随时应用 ...
- 什么是智能仓储?一文带你彻底搞懂!
来源:机器人网 什么是智能仓储? 智能仓储是仓库自动化的产物. 与智能家居类似,智能仓储可通过多种自动化和互联技术实现.这些技术协同工作以提高仓库的生产率和效率,最大限度地减少人工数量,同时减少错误 ...
- 一文带你轻松搞懂事务隔离级别(图文详解)
本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...
- C++微服务RPC框架,一文带你彻底搞懂 RPC
RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议.我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点, ...
- 一文带你彻底搞懂Docker中的cgroup
前言 进程在系统中使用CPU.内存.磁盘等计算资源或者存储资源还是比较随心所欲的,我们希望对进程资源利用进行限制,对进程资源的使用进行追踪.这就让cgroup的出现成为了可能,它用来统一将进程进行分组 ...
- 一文带你彻底搞懂C++中一些常见指针(形如*p)的用法
提高指针效率以及程序可读性 为什么要后置运算符? 有C语言编程经验的人可能会感到疑问,为什么在C++里面我们推荐优先使用运算符的前置版本,就是把运算符号放在变量的前面,前置版本的递增避免了不必要的工作 ...
最新文章
- 重读TCP协议(3)
- mov	word [LABEL_DESC_CODE32 + 2], ax
- [Linux] 不带JRE版本的LumaQQ安装方法
- efcore mysql autofac_Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
- hibernate工厂模式_Hibernate锁定模式–乐观锁定模式如何工作
- 全国计算机二级公共知识点,全国计算机二级公共基础知识知识点
- 关于物联网规则引擎技术,你想要知道的都在这儿!
- 05 Java 求职简历制作
- 数电第四章:组合逻辑电路
- 企业微信的聊天记录保存在了哪里?
- app录制回放 jmeter_Jmeter使用之脚本录制回放
- fastadmin列表中,时间显示,格式设置
- SpringBoot学期总结
- 在线旅游网站盈利模式
- 爱加密Android APk 原理解析
- iPad游戏突然没有声音问题
- C#: //todo
- 前端模糊匹配方式,前端正则模糊匹配
- 短视频底层实操课,让你迅速从短视频新手变成高手
- 代码之外——醒世良言
热门文章
- Go语学习笔记 - websocket gorilla(附测试代码) | 从零开始Go语言
- 图文并茂详细教程之——用pixhawk飞控组装一台S500四轴无人机(下)(苍穹四轴)
- 开年纳新|天空卫士家族荣誉谱上再添多名新“成员”
- 金融反欺诈-交易基础介绍 - 阿里巴巴云誉【转载】
- Android中AlarmManager的使用
- 怎么优化自己网站的关键词_新网站seo必做步骤
- 【电子、电气、人工智能、图像处理、红外】EI会议(2023)
- 软件测试 遇到bug却无法重现怎么办?
- Book: Programming with Libevent(2)--A Libevent Reference Manual(1)
- 国外交友网站开发源码 第十二篇