海明校验码的计算及检验

article/2025/10/31 19:59:30

海明校验码的计算及检验


目录

  • 海明校验码的计算及检验
  • 知识背景
  • 计算海明校验码
    • 步骤一:计算校验码位数
    • 步骤二:确定校验组
    • 步骤三:计算校验码的值得出海明校验码
  • 利用海明校验码校验数据
    • 其他
  • 总结

最近和兄弟探讨一个海明校验码的题目,因为学了很久所以有些记不清了,趁这这个机会,复习了一下海明校验码及校验过程,以此为记录。

知识背景

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

我们知道,通常情况下使用奇偶校验法可以识别数据是否发生错误,但是并不能知道是哪里的数据发生了问题。有了这个前提,于是我们观察到海明校验码,它增加很少的几个校验位来检测出出错数据的位置,其检测原理概述如下:

百度百科: “它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。”

现在看来或许还是比较不容易看懂,接下来我用过一个做过的实验题目来分析。

计算海明校验码

首先介绍一下海明校验码公式: 2 k > = n + k + 1 2^k >= n + k + 1 2k>=n+k+1

公式中,k为校验码的位数,n为原数据的位数。

2 k 2^k 2k表示这 k k k位能够表示的状态数,因为每一个校验码都有0或1两种可能,那么和原数据组合产生的状态数量就是 2 k 2^k 2k种,在这么多种可能中有一种状态代表正确校验的情况,而剩下的 2 k − 1 2^k-1 2k1种状态就用来对应错误校验的情况。

2 k − 1 2^k-1 2k1种情况最起码要比总位数(原数据位数+校验码位数)多,所以就得到 2 k − 1 > = n + k 2^k-1>=n+k 2k1>=n+k

通过这个公式,我们就可以计算出一个已知原始数据所需要的最小校验位数。下面举一个我做过的一个实验题目作为例子:

下标4321
数据0110

步骤一:计算校验码位数

这一原始数据 0110 0110 0110 n = 4 n = 4 n=4,根据海明校验码公式可以得到需要添加的校验码位数 k = 3 k=3 k=3

有话说: 校验码放置的位置应为2的整数次幂,即 P i = 2 i P_{i}=2^i Pi=2i.

于是我们得到了这样一个待计算的海明码:

下标7654321
数据011 P 2 P_{2} P20 P 1 P_{1} P1 P 0 P_{0} P0

其中, P 0 P_{0} P0 P 1 P_{1} P1 P 2 P_{2} P2为三个我们添加的校验码

步骤二:确定校验组

接下来我们为每一个数据添加校验组,校验组是什么意思呢,就是这一下标对应的数据可以由一个校验组来唯一对应检验。通俗地讲,做法就是将每一个数据位的下标分解成校验码所在下标的和,(校验位不分解),拿我们的例子来看看:

下标7654321
下标分解1+2+42+41+441+221
数据011 P 2 P_{2} P20 P 1 P_{1} P1 P 0 P_{0} P0
校验组 P 0 P_{0} P0 P 1 P_{1} P1 P 2 P_{2} P2 P 1 P_{1} P1 P 2 P_{2} P2 P 0 P_{0} P0 P 2 P_{2} P2 P 2 P_{2} P2 P 0 P_{0} P0 P 1 P_{1} P1 P 1 P_{1} P1 P 0 P_{0} P0

有话说: 例如下标5还可以分解成2+3那为什么不选2+3呢?这是因为下标3是数据位而不是校验位,所以这里我们选的是1+4的分解。

这样一来,每一个数据都可以由唯一确定的校验组来校验

步骤三:计算校验码的值得出海明校验码

计算海明校验码的最后一个步骤就是得出 P 0 P_{0} P0 P 1 P_{1} P1 P 2 P_{2} P2的具体值,其做法为:
计算 P i P_{i} Pi的值,就在校验组中将与 P i P_{i} Pi有关的那几组数据做 异或(相同为0,不同为1) 运算
拿我们的例子来看看:

下标7654321
数据011 P 2 P_{2} P20 P 1 P_{1} P1 P 0 P_{0} P0
校验组 P 0 P_{0} P0 P 1 P_{1} P1 P 2 P_{2} P2 P 1 P_{1} P1 P 2 P_{2} P2 P 0 P_{0} P0 P 2 P_{2} P2 P 2 P_{2} P2 P 0 P_{0} P0 P 1 P_{1} P1 P 1 P_{1} P1 P 0 P_{0} P0
有关下标5 6 73 6 73 5 7
运算 1 ⊕ 1 ⊕ 0 1\oplus1\oplus0 110 0 ⊕ 1 ⊕ 0 0\oplus1\oplus0 010 0 ⊕ 1 ⊕ 0 0\oplus1\oplus0 010
结果011

计算结束后,和原来的数据组合我们就得到了海明校验码:

下标7654321
数据011 P 2 P_{2} P20 P 1 P_{1} P1 P 0 P_{0} P0
海明校验码0110011

利用海明校验码校验数据

接下来我们利用海明校验码来校验数据:
例如我们有一个待检测的数据:

下标7654321
数据0010011

由上文所讲,校验码的值是由与之相关的数据异或得到,例如: P 0 = 0 ⊕ 1 ⊕ 0 = 1 P_{0}=0\oplus1\oplus0=1 P0=010=1,所以如果这个校验码的值没有改变,即 P 0 ′ = P 0 P'_{0}=P_{0} P0=P0,那么我们可以得到的就是 P 0 ′ ⊕ P 0 = 0 P'_{0}\oplus P_{0}=0 P0P0=0,反之,若 P 0 ′ ⊕ P 0 = 1 P'_{0}\oplus P_{0}=1 P0P0=1我们就可以判定该校验位所能够影响的几个位置存在错误。其中 P 0 ′ P'_{0} P0为待检测数据按上述同样方法计算的校验码的值。以上述待检测数据为例:
P 0 ′ ⊕ P 0 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0 P'_{0}\oplus P_{0}=0\oplus1\oplus0\oplus1=0 P0P0=0101=0 正确
P 1 ′ ⊕ P 1 = 0 ⊕ 0 ⊕ 0 ⊕ 1 = 1 P'_{1}\oplus P_{1}=0\oplus0\oplus0\oplus1=1 P1P1=0001=1 该校验位能影响的位置存在错误
P 2 ′ ⊕ P 2 = 1 ⊕ 0 ⊕ 0 ⊕ 0 = 1 P'_{2}\oplus P_{2}=1\oplus0\oplus0\oplus0=1 P2P2=1000=1 该校验位能影响的位置存在错误

下标7654321
数据0010011
校验组 P 0 ′ P'_{0} P0 P 1 ′ P'_{1} P1 P 2 ′ P'_{2} P2 P 1 ′ P'_{1} P1 P 2 ′ P'_{2} P2 P 0 ′ P'_{0} P0 P 2 ′ P'_{2} P2 P 2 ′ P'_{2} P2 P 0 ′ P'_{0} P0 P 1 ′ P'_{1} P1 P 1 ′ P'_{1} P1 P 0 ′ P'_{0} P0
有关下标5 6 73 6 73 5 7
P i ′ P'_{i} Pi 1 ⊕ 0 ⊕ 0 = 1 1\oplus0\oplus0=1 100=1 0 ⊕ 0 ⊕ 0 = 0 0\oplus0\oplus0=0 000=0 0 ⊕ 1 ⊕ 0 = 1 0\oplus1\oplus0=1 010=1
P i P_{i} Pi011
P i ′ ⊕ P i P'_{i}\oplus P_{i} PiPi110

由此我们组合可能出现错误位置的校验码 P 1 ′ + P 2 ′ P'_{1}+P'_{2} P1+P2对应下标为6的数据,将它取反便可更正。

其他

其实这里也可以这样理解,相当于给这个新的数据求新的校验值和原来的比对:
p1

总结

  • 同步更新至CSDN,仅作实验记录之用。
  • 水平有限,文章有需要改正之处还望指出。

http://chatgpt.dhexx.cn/article/7FPtssvQ.shtml

相关文章

海明校验码举例

海明校验码举例: 编制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楼…

Echarts南丁格尔玫瑰图、锥形柱状图、渐变曲线图

目录 1、南丁格尔玫瑰图 2、锥形柱状图 3、渐变曲线图 4、曲线图 1、南丁格尔玫瑰图 option {title: {text: 作物占比,left: 50, // 组件离容器左侧的距离top: 20},legend: {top: 52%,x: center,y: top,width: 180,height: 60,itemGap: 30,itemWidth: 15,itemHeight: 1…