海明校验码原理以及作用机制的介绍

article/2025/10/31 19:42:02

什么是海明校验码?

由Richard Hamming于1950年提出、还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠错。

它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。(来源百度百科)

简单地说:海明校验码是一种能够纠正一位错误检测两位错误并且能够自动恢复出错位的校验码。

编码原则:

假设数据位的位数为 k 位,校验位数为 r 位,在编制海明码的时候,需要满足海明不等式:2^{r}\geqslant k+r+1。也可以理解为信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,则海明不等式又可以表达为:2^{r}\geqslant n+1

在海明不等式——2^{r}\geqslant k+r+1中,1是表示用其中的一个状态信息表示没有发生错误,其余的状态信息用于指出错误并且发生在哪一位,又因为检验位也可能发生错误,所以是 k+r 个。(在这里讲明一下,因为海明校验码在设计之初就是能够发现并纠正一位错误,所以你在看这个不等式时要带着发生一位错误的角度去看待!

数据位和校验位的对应关系表:

信息码位数

1

2~45~1112~2627~5758~120
校验码位数234567

但是在实际运用中应该是2^{r-1}\geqslant k+r+1,详情请看评论区的解释!再次感谢—猫猫官人—提出的问题!(*^_^*)

信息码位数

1-3

4-1011-2526-5657-119
校验码位数45678

海明码编制的基本规则:

假设海明码的最高位的位号为m,最低位号为1,海明码为Hm Hm-1 ··· H1。海明码的编码规则如下:

(1)校验位与数据位个数之和为m,每个校验位Pi在海明码中被分在位号为2^{i-1}的位置上,其余各位为数据位Di,并按照从低到高逐位依次安排各个数据位。

(2)海明码的每一位码(包括数据位和校验位本身)由多个校验位进行校验,其关系是被校验的每一位位号要等于校验它的各校验位的位号之和。

(3)在增大合法码的码距时,使得所有的码距尽量均匀的增大,以保证对所有码的验错能力平衡提高。

那么什么是码距呢?

码距:任何一种编码都是由码字构成的,任何两个码字之间最少变化的二进制位数,被称为“数据校验码的码距”。

——码距大于等于二的数据校验码,才开始具有检错能力。码距越大,检错纠错能力就越强,但是无论怎么变化,检错能力总是大于等于纠错能力的。

举例说明:为一个8位的二进制数编海明码。

解:根据海明码不等式2^{r-1}\geqslant k+r+1,在这个题目中数据位数k=8,所以校验位数r=5,所以海明码的位数为k+r=13。

海明码:H_{13}H_{12}H_{11}H_{10}H_{9}H_{8}H_{7}H_{6}H_{5}H_{4}H_{3}H_{2}H_{1}

根据规则一:校验位与数据位个数之和为m,每个校验位Pi在海明码中被分在位号为2^{i-1}的位置上,其余各位为数据位Di,并按照从低到高逐位依次安排各个数据位。

根据该规则可知,校验位Pi应当放置在1,2,4,8,16的位置上,但是由于海明码一共才13位,所以本应该放置在第16位置上的校验位实际放置在第13位上。

H_{13}H_{12}H_{11}H_{10}H_{9}H_{8}H_{7}H_{6}H_{5}H_{4}H_{3}H_{2}H_{1}各位对应为——>P_{5}D_{8}D_{7}D_{6}D_{5}P_{4}D_{4}D_{3}D_{2}P_{3}D_{1}P_{2}P_{1}

根据规则二:海明码的每一位码(包括数据位和校验位本身)由多个校验位进行校验,其关系是被校验的每一位位号要等于校验它的各校验位的位号之和。

出错的海明码号和校验位位号的关系:

海明码位号

数据位校验位

参与校验的校验位位号

被校验位的海明码位号=校验位位号之和

H1

P1

1

1=1

H2

P2

2

2=2

H3

D1

1,2

3=1+2

H4

P3

4

4=4

H5

D2

1,4

5=1+4

H6

D3

2,4

6=2+4

H7

D4

1,2,4

7=1+2+4

H8

P4

8

8=8

H9

D5

1,8

9=1+8

H10

D6

2,8

10=2+8

H11

D7

1,2,8

11=1+2+8

H12

D8

4,8

12=4+8

H13

P5

13

13=13

通过观察上面的表格,我们可以发现,5个校验位只与本身有关,数据位则与多个校验位有关。D1由P1和P2校验、D3由P2和P4校验... ...

  • P1校验D1、D2、D4、D5、D7

  • P2校验D1、D3、D4、D6、D7

  • P3校验D2、D3、D4、D8

  • P4校验D5、D6、D7、D8

其中D4和D7都出现了三次,其余的数据位置出现了两次,这就说明对于每一个数据位的校验能力是不均衡的(不符合规则三的要求),为了平衡一下,因此我们增添P5。

  • P5校验D1、D2、D3、D5、D6、D8

就此我们可以得出一个结论:当一位数据位Di发生变化时,必将引起三个校验位Pi的变化,即合法的海明码的码距都为4。

根据上面的校验关系,我们写出校验位的偶校验方程

那么什么是偶校验呢?

奇偶校验码:

——发送方:附加1位冗余位,使码字中“1”的个数保持为奇数或偶数

——接收方:根据所收到的码字中“1”的个数是奇数或偶数判别是否有传输差错。

所以偶校验就是附加1位冗余位,使得码字中“1”的个数保持偶数个。奇校验就是附加一位冗余位,使得码字中“1”的个数保持奇数个。 

(来源自我的之后的博客!) 

偶校验方程:(⊕为异或符号(其实这里取巧了,因为当“1”的个数是偶数个时,经过异或运算之后结果就为0了。)

P1=D1⊕D2⊕D4⊕D5⊕D7

P2=D1⊕D3⊕D4⊕D6⊕D7

P3=D2⊕D3⊕D4⊕D8

P4=D5⊕D6⊕D7⊕D8

P5=D1⊕D2⊕D3⊕D5⊕D6⊕D8

那么我要是进行奇校验,那怎么书写奇校验方程呢?

在原方程的基础上加上一个⊕1就好了,譬如上面的P1就变成了P1=D1⊕D2⊕D4⊕D5⊕D7⊕1。

你要是觉得这个花里胡哨, 那来一点实在一点的,直接按照奇偶校验的原理来求解校验位的取值!

假设要传送的数据为:10110110,那么:

  • P1校验D1、D2、D4、D5、D7

  • P2校验D1、D3、D4、D6、D7

  • P3校验D2、D3、D4、D8

  • P4校验D5、D6、D7、D8

P1对应的校验数据为01010(75421),如果是偶校验,01010中“1”的数目为偶数个,所以P1=0;如果是奇校验,01010中“1”的数目为偶数个,所以为了凑足奇数个,所以P1=1。

P3对应的校验数据为1011(8432),如果是偶校验,1011中“1”的数目为奇数个,所以为了凑足偶数个,所以P3=1;如果是奇校验,1011中“1”的数目为奇数个,所以P3=0。

接下来看看海明码如何进行检错和纠错的!

检错和纠错机制:

假设发送端发送的数据为D8~D1,海明校验位的取值就是P1、P2、P3、P4、P5,;在数据接收端,接收到的海明校验码为P_{1}^{`}  P_{2}^{`}  P_{3}^{`}  P_{4}^{`}  P_{5}^{`}

令:S1=P_{1}^{`}  ⊕P1、S2=P_{2}^{`}  ⊕P2、S3=P_{3}^{`}  ⊕P3、S4=P_{4}^{`}  ⊕P4、S5=P_{5}^{`}  ⊕P5。

  • 当S1~S5全为零时,表示无错。(因为S1~S5都为零,表示P_{1}^{`}  ~P_{5}^{`}  和P1~P5完全相同;说明接收端和发送端的数据完全一样,没有发生错误。)

  • 当S1~S5中仅有一位不为0时,说明有一个校验位出错。

  • 当两位不为零时,表示两位海明码出错。

  • 当三位不为零时,表明一个数据位出错。出错的海明码位号由S4~S1四位的编码值得出。(因为一个数据位的变化必将引起三个校验位的变化,所以当三位不为零时,就表明一定有一个数据位出错了。)

  • 当中有4位或5位不为0时,表明出错情况严重,系统可能出现故障,应该检查系统硬件的正确性。

举例说明:如果要传送的数据为:10110110,请编写海明码。

根据校验方程求得:P1=0,P2=0,P3=1,P4=1,P5=1;所以,海明码为1101110111000

假设在传送过程中发生了错误,接收方接收到得数据为10111110,D4位由0变成了1,发生了错误,根据校验方程,求得:

P_{1}^{`}  =1、P_{2}^{`}  =1、P_{3}^{`}  =0、P_{4}^{`}  =1、P_{5}^{`}  =1;因此求得S1=1、S2=1、S3=1、S4=0、S5=0。

由于S1~S5中有3个不为零,由此可以判断有一个数据位出现了错误;又因为S4~S1的编码为0111,说明第7位海明码出错,也就是D4出错了。

Ending... ...


http://chatgpt.dhexx.cn/article/OstXOALO.shtml

相关文章

海明校验码的计算及检验

海明校验码的计算及检验 目录 海明校验码的计算及检验知识背景计算海明校验码步骤一:计算校验码位数步骤二:确定校验组步骤三:计算校验码的值得出海明校验码 利用海明校验码校验数据其他 总结 最近和兄弟探讨一个海明校验码的题目&#xff0c…

海明校验码举例

海明校验码举例: 编制ASCII字符M的海明校验码。 解:M的ASCII码为A6A5A4A3A2A1A01001101 M为7位那么海明码最少需要2i,也就是说需要,才能表示出来,(238) 用哪些信息位分别被哪些校验位效验如…

计算机底层:海明校验码。

计算机底层:海明校验码。 海明校验码是由奇偶校验码中的偶校验延申出来的: 计算机底层:奇偶校验码_srhqwe的博客-CSDN博客 了解海明校验码之前需要先了解奇偶校验码。 海明校验码设计思路: 需要知道:多个校验位就能携…

海明校验码

1. 海明码的特点: 其中m表示数据位的位数,k表示海明校验码的位数 k位海明校验码一共可以表示种校验信息结果,其中有一种要用来表示没有出错的情况,则其余还剩-1种结果,为了使校验结果可以指出任一位出错的位置&#x…

计算机组成原理学习笔记:海明校验码

概述 海明校验码又可以称为汉明校验码, 这只是一个音译的问题, 作者是 Richard Hamming海明校验码对于信息纠错这个领域的贡献十分巨大,Richard Hamming 获得了1968年的图灵奖内容主要包括:海明校验码的思想、如何构建海明校验码、如何使用海明校验码 …

海明码校验【简单详细】

海明码 1.什么是海明码: 一个名叫Richard Hanming老爷爷在1950年提出的检验纠错方法,它具有一位纠错能力。 2.海明码的计算方法: 设欲检测的二进制代码为n位,K为检测位(提供纠错),总共nk位代码 当中检测位满足的关系: 2 k 2^{k} 2k>(nk1) 此关系也是求不同代码长…

一文看懂海明校验码及其计算方法(详细总结)

网上看了好几篇文章后终于算是捋明白了,但是看到的这些资源要么说得云里雾里,要么干脆说得有问题(然后还被点了好多赞。。。),无论如何这些都容易误导小白。作为C站多年老潜水员,我还是把海明校验码的要点总…

ResNets

ResNets 背景: 非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。 《转载更改》 https://blog.csdn.net/qq_29893385/article/details/81207203 ResNets是由残差块(Residual block)构建的 首先解释一下什么是…

正确定位混淆后Crash代码行数

Android--定位混淆后Crash代码行数 一、需求背景二、前期准备三、对混淆日志进行还原四、示例 一、需求背景 打包时需要对代码进行混淆,目的是增加安全性,防⽌反编译。但这会导致App崩溃时,抓到的日志堆栈中显示的代码行数对应不上&#xff…

repalce

1、replace基本用法 <script>/*要求将字符串中所有的a全部用A代替*/var str "javascript is great script language!";//只会将第一个匹配到的a替换成Aconsole.log(str.replace("a", "A")); // > jAvascript is great script language…

Android studio 4.2新特性及升级异常

Android studio 版本及特性系列目录 Android 12 终于来了&#xff0c;你准备好了吗&#xff1f;Android studio 4.2新特性Android studio 4.1新特性Android Studio 4.0新特性及升级异常Android Studio3.6. 插件搜索不到终极解决方案 Android studio 4.2新特性 前言升级异常Gra…

强化学习的学习之路(五十一)2021-02-20 Retrace

作为一个新手&#xff0c;写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程&#xff0c;希望对大家能有所帮助。这个系列后面会不断更新&#xff0c;希望自己在2021年能保证平均每日一更的更新速度&#xff0c;主要是介绍强化学习的基础知识&#xff…

RecId

我记得好像AX最初版本RecId是所有表都唯一的。但是这样有一个坏处就是限制了数据库可存储的数据的条数。D365FO中RecId 不再全局唯一&#xff0c;但是表唯一。 每个表都有一个Sequences生成表的RecId,格式是&#xff1a;SEQ_TableId 右键Sequences可以看下当前RecId的值&#…

ResNet过程

#ResNet 因为网络传播的层次太深&#xff0c;后面的很难传播到前面&#xff0c;所以增加了一个短接层&#xff0c;深层次网络可以退化成一个浅层次网络 #filter_num 卷积核数量 #stride 步长 class BasicBlock(layers.Layer):def __init__(self,filter_num,stride1):super(Bas…

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志 &#xff08;1&#xff09;如果Android Studio里面没有安装下列插件之一的&#xff0c;在Settings的Plugins里面安装其中一个&#xff1a; &#xff08;2&#xff09;菜单栏中的code里面找到反混…

android还原代码混淆proguard日志的工具--retrace和SmartRetrace

介绍 代码混淆时android反编译的常用方法&#xff0c;android SDK提供了Proguard工具&#xff0c;路径是 ANDROID_SDK_HOME/tools/proguard 命令行在ANDROID_SDK_HOME/tools/proguard/bin下&#xff0c;而实际的执行代码路径为ANDROID_SDK_HOME/tools/proguard/lib apk经过混…

with recursive用法

with recursive 则是一个递归的查询子句&#xff0c;他会把查询出来的结果再次代入到查询子句中继续查询。 with recursive d(n, fact) as ( values (1,2) union all #合并 select n1, (n1)*fact from d where n < 5) SELECT * from d;递归过程如下&#xff1a; n1 fact2 n…

python实验之绘制南丁格尔玫瑰图

一、实验目的 了解玫瑰图的前世今生&#xff1b;了解 matplotlib 标准库中的 pyplot 模块&#xff1b;了解在极坐标 系中绘制柱状图。 二、实验基本原理及步骤&#xff08;或方案设计及理论计算&#xff09; 实验步骤&#xff1a; 查阅文档&#xff0c;了解南丁格尔玫瑰图的原…

南丁格尔玫瑰图 | 集才华和美貌于一身的数据图表

南丁格尔玫瑰图将柱图转化为更美观的饼图形式&#xff0c;是极坐标化的柱图&#xff0c;其夸大了数据之间差异的视觉效果&#xff0c;适合展示数据原本差异小的数据。 1、玫瑰图的前世今生 长得像饼图又不是饼图&#xff0c;这种有着极坐标的统计图有着一个美丽的名字—南丁格…

雷达图+南丁格尔玫瑰图

具体实现的效果图&#xff1a; 使用的图表插件是echarts,具体的完整代码如下&#xff1a; import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option;var arr [{ name: 1楼, value: 30 },{ name: 2楼…