图解奇偶校验与海明码的详细过程

1、校验码的基本概念

名不正则言不顺,要想真正理解校验码的原理,那就必须要搞清楚相关的概念!

首先,通过下面这个图,认识一下校验码在信息传输中的位置。看懂了这个图,能更好的理解在信息传输中,为什么需要校验码,以及校验码到底做了什么!

在这里插入图片描述

  1. 原数据:就是真正需要正确传输的数据;比如,某人的年龄 23 岁,这个 23 就是原数据;
  2. 校验码:为了让传递的数据,具有一定的检错和纠错能力,添加的辅助信息;
  3. 编码数据:实际传输的数据,由原数据和校验码两部分组成;
  4. 合法编码:数据正确传输时,可能出现的全部编码的集合;
  5. 错误编码:数据传输出错时,可能出现的全部编码的集合;

上面这些描述,还是有些不够直观,下面通过一个例子,细说一下:
在这里插入图片描述
场景说明:

某男子 A,需要将自己的年龄信息,传递给女子 B,传递信息的方式,只有一种,就是通过装着与其年龄相等的沙粒的盒子,传输过程中,无法避免沙粒丢失或增加。

  • 原数据:为代表着男子 A 年龄的数字,也就是 23。
  • 合法编码:所有自然数;
  • 错误编码:无;所有的数字都认为是合法的
  • 码距:合法编码(自然数)之间的距离,也就是 1;

数据编码 = 合法编码 + 错误编码;
码距 = 数据编码 / 合法编码

可见,错误编码越多,码距越大,比如奇偶检验码的码距为2,码距越大检错和纠错的能力越强!

如果不进行任何的编码校验,直接在盒子中放 23 粒沙子,那么女子 B 收到盒子后,数一下沙粒的个数,就可以得到男子 A 的年龄。问题是,传递过程是不安全的,女子得到的男子的年龄信息也就不可靠了,本来是 23,最后可能变成了 32,也可能是 82,后果非常严重!

由于男子 A 是一名程序员,当他意识到问题的严重性时,决定使用 校验码 的机制来提高数据的检错与纠错能力。

在这里插入图片描述

  • 原数据:23
  • 合法编码:所有能整除 10 的数字;
  • 错误编码:所有不能整除 10 的数字;
  • 码距:合法编码之间的距离,10

通过这种方式,传输的数据具有了很强的检错能力,所有不能整除 10 的数目,都是错误数据(也就是错误编码);同时,也具有了一定的纠错能力,比如,通过沙粒总数除以10取整的方式,可以纠错所有新增不超过10个沙粒的传输错误。

2、奇偶校验码

奇偶校验是一种简单有效的校验方法,这种方法通过在编码中增加一位校验位来使编码中 1 的个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为 2 。

例如,原数据为 23,二进制编码为 10111
在这里插入图片描述
例如,添加偶校验之后,编码数据包括校验码和数据码,详细信息如下图所示:
在这里插入图片描述
奇偶校验码可以检测编码中的错误编码,但是编码在传输中发生错误后转换成了另外一个合法编码的情况,奇偶校验是无法检测出来的。

例如,23 在偶校验的情况下编码为 010111,当发生两位错误变成 010100 时,接收到数据后,仍然认为是合法编码,解码后得到的结果为 20。

3、海明码

海明码是一种设计非常精巧的校验码,由贝尔实验室设计,同时,它也是利用奇偶性来检错和纠错。

一种校验码算法,总是要解决以下几个核心问题:

  1. 确定校验码的个数
  2. 确定校验码的位置
  3. 确定校验码的校验对象
  4. 计算校验码的值

顺着这几个问题,就可以一步步的、轻松的解开海明码的设计原理。

3.1 校验码的个数

海明码是通过在数据位之间的特定位置上插入 k 个校验位,以此扩大数据编码的码距,实现对数据编码的检错和纠错。

那么问题来了,当给定 n 个数据位时,海明码需要插入几个校验码呢?请记住下面这个公式:

2 k − 1 ≥ n + k 2^k-1 \geq n + k 2k1n+k

其中 n 是 数据位的个数,k 为校验位的个数。比如当数据是 101010 时,数据位为 6。

例如 数据为 23,那么确定 k 的大小的过程:

  • 当 k = 1 时, 2 1 − 1 ≥ 23 + 1 {2^1-1 \geq 23 +1 } 21123+1 不成立;
  • 当 k = 2 时, 2 2 − 1 ≥ 23 + 2 {2^2-1 \geq 23 +2 } 22123+2 不成立;
  • 当 k = 3 时, 2 3 − 1 ≥ 23 + 3 {2^3-1 \geq 23 +3 } 23123+3 不成立;
  • 当 k = 4 时, 2 4 − 1 ≥ 23 + 4 {2^4-1 \geq 23 +4 } 24123+4 不成立;
  • 当 k = 5 时, 2 5 − 1 ≥ 23 + 5 {2^5-1 \geq 23 +5 } 25123+5 成立;

因此,可以确定当数据位个数为 23 时,海明码需要 5 个校验码!

至于为什么是这个公式,后面再慢慢解释,先记住它,这就是海明码确定校验码个数的方法!

3.2 校验码的位置

当确定了校验码的个数后,这些校验码放在什么位置上呢?

首先,编码数据包含原数据和校验数据,当知道了原数据个数和校验码的个数之后,就知道了编码数据的总位数,对编码数据位号进行二进制编码,这些二进制编码中包含数字 1 的总个数为 1 的编码所处的位置,就是校验码的位置。

文字描述很晦涩,下面举例说明:

数据位 23 个,需要校验码 5 个,总数为 28,对这28个数的序号进行二进制编码:
在这里插入图片描述

如上图所示,校验码的位置分别为 1,2,4,8,16(这些位置上对应的二进制编码中包含1 的个数为 1, 剩下的全部为 0),也就是说在总共 28 个数据位中,第 1,2,4,8,16 位置的数据是校验码,其他的位置是数据,也就是说 23 个数据中,第 1 个数据位在海明码中的位置为 3,因为 1,2 位置是校验码。

3.3 校验关系

海明码本质上仍然是利用的奇偶校验的特性,对于奇偶校验,编码数据中只能有一个校验码,其他为数据码。海明码通过插入多个校验码的方式来扩大码距,但是仍然不能违背奇偶校验的原则,也就是说一组奇偶校验编码数据中,只能包含一个校验码。这件事情非常重要。

那么,海明码是如何确定校验码与被校验数据之间的关系呢?看下图:
在这里插入图片描述
通过上图,可以很直观的看到以下信息:

  1. 有几个校验码,就会有几个奇偶校验组;
  2. 每个校验组关联的数据是其所在列序号的二进制码中包含 1 的序号;

在这里插入图片描述

正是基于这种映射机制,所以才有上面几步中,确定校验码个数和确定校验码位置的逻辑。

3.4 计算校验码的值

海明码是基于奇偶校验,默认是使用偶检测,因为使用偶检测在纠错的时候更方便。

通过上面三个步骤,知道了校验码的个数和位置,也知道了奇偶校验的关系,接下来就可以对每一组数据执行偶校验,然后将结果填写到校验码对应的位置!

下面,举一个简单的例子:设数据为 01101001,总共 8 位,也就是说 n = 8,根据公式 2 k − 1 ≥ n + k {2^k-1 \geq n + k } 2k1n+k 可求得 k 的值应该位 4。

根据上面的步骤,可以求得下图所示的映射关系图:
在这里插入图片描述

将数据 01101001 按顺序填入到海明码对应的位置,结果如下:
在这里插入图片描述
接下来,就是根据映射关系来计算校验位的值:

奇偶校验组 1,根据偶校验的定义,要保证所有元素中包含 1 的个数位偶数个,因此,校验位的值必须为 1!
在这里插入图片描述
同样的逻辑,最终可得海明码为:
在这里插入图片描述

上面的示例,原题如下:
在这里插入图片描述

3.5 检错与纠错

当接收到海明码时,需要对各个校验组进行奇偶校验,以偶校验为例。

仍然以上衣步骤中的例子来举例,分别对 { 校验组 1,校验组 2, 校验组 3, 校验组 4 } 中的元素进行偶校验,得到结果分别为 G1, G2, G3, G4 。

当所有结果都是 0 的时候,说明海明码为合法编码,数据传输正确;当结果中不全为 0 时,说明发生了错误,得到的编码为错误编码。

那么当发生错误的时候,如何进行纠错呢?

将偶校验的结果进行二进制编码,形式为 G4G3G2G1,其对应二进制的值,就是发生错误的位置,比如偶校验的结果:

  • G1 = 0
  • G2 = 1
  • G3 = 0
  • G4 = 1

可得到二进制数 G4G3G2G1 = 1010,十进制数为 10,那么说明,海明码的第十位数出错了,将其取反就可以纠错了!

至于为什么,看一下这个图就明白了:
在这里插入图片描述
海明码可以检测出两位错,但是只能纠正一位错!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值