文章目录

  • 1、校验码的基本概念
  • 2、奇偶校验码
  • 3、海明码
    • 3.1 校验码的个数
    • 3.2 校验码的位置
    • 3.3 校验关系
    • 3.4 计算校验码的值
    • 3.5 检错与纠错

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 个数据位时,海明码需要插入几个校验码呢?请记住下面这个公式:

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

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

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

  • 当 k = 1 时,21−1≥23+1{2^1-1 \geq 23 +1 }21−1≥23+1 不成立;
  • 当 k = 2 时,22−1≥23+2{2^2-1 \geq 23 +2 }22−1≥23+2 不成立;
  • 当 k = 3 时,23−1≥23+3{2^3-1 \geq 23 +3 }23−1≥23+3 不成立;
  • 当 k = 4 时,24−1≥23+4{2^4-1 \geq 23 +4 }24−1≥23+4 不成立;
  • 当 k = 5 时,25−1≥23+5{2^5-1 \geq 23 +5 }25−1≥23+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,根据公式 2k−1≥n+k{2^k-1 \geq n + k }2k−1≥n+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,那么说明,海明码的第十位数出错了,将其取反就可以纠错了!

至于为什么,看一下这个图就明白了:

海明码可以检测出两位错,但是只能纠正一位错!

图解奇偶校验与海明码的详细过程相关推荐

  1. ZABIX5.0.7源码安装详细过程

    ZABIX5.0.7源码安装详细过程 Zabbix5.0源码安装文档 一:Linux初始设置 关闭selinux vi /etc/selinux/config SELINUX=disabled 关闭网 ...

  2. 纠错编码--海明码(动一发而牵全身)

    纠错编码–海明码 海明码:发现双比特,纠正单比特错 工作原理:动一发而牵全身 假设发送4位数据,在它上面加上冗余信息(冗余码,校验码),但是校验码很厉害,不但可以校验自身,同时还可以校验几位 发现有一 ...

  3. 海明码检错与纠错,经典例子讲解~

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  4. 海明码相关知识及解题方法

    ------海明码的详细解读及做题步骤------ ①数据位为n位,检验位有k位 则海明码=n+k 当且仅当:2^k-1≥n+k ②用符号D代表数据位,P代表检验位,H代表海明码----->满足 ...

  5. 检错纠错理论——海明码与海明距离

    概念解释 先说明几个概念(非严谨定义) 码字:一个包含了数据位和校验位的n位单元,也就是"一种"编码 编码:由码字组成的可以表达传递信息的集合,这里不是指编码的过程,而是一个名词. ...

  6. java 奇偶校验_校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  7. 一文搞定校验码(奇偶校验,海明,CRC 码)

    文章目录 效验码 计算码距方法 奇偶校验码 校验原理 奇偶校验 异或法制 总结 海明校验码 海明校验码的分布规律 海明码纠错以及定位 实现原理 海明码完善 总结 循环冗余校验码(CRC) 模2除算法 ...

  8. 【原创】用VMware 8安装Ubuntu 12.04详细过程(图解)

    图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像文 ...

  9. Linux安装Mysql5.7详细过程(源码安装)

    Linux安装Mysql详细过程(源码安装) 第一步:下载 进入到mysql官网下载自己对应版本的mysql, 下载地址:https://dev.mysql.com/downloads/mysql/5 ...

最新文章

  1. 一些关于Hibernate延迟加载的误区
  2. PHP前端和数据库的连接
  3. rstudio 关联r_使用关联规则提出建议(R编程)
  4. latex自动生成中文目录_texpad: 中文输出+自动参考文献生成(bib+bst)
  5. HDU 1010 深搜+奇偶剪枝
  6. android多线程实现计时器,方法一、使用Handler和Thread(线程)实现定时器
  7. theano java_Theano:调用Theano函数的论据
  8. mes系统服务器架构,MES系统三大层结构是什么
  9. 田口设计(正交设计)——参数设置方法
  10. 新闻App详细开发流程和结构搭建
  11. 西安交通大学MOOC C++期末1
  12. 报错解决:urllib3.exceptions.MaxRetryError
  13. iPhone手机史上最全的扫盲帖【解锁,激活,Cydia,基带,裸机】
  14. C#交错数组和参数数组
  15. 本地安装kylin学习环境
  16. python爬虫58同城(多个信息一次爬取)
  17. nginx 13: stat() “/root/xxx/index.html“ failed (13: Permission denied)
  18. ASP.NET MVC 單元測試系列 (5):瞭解 Stub 假物件
  19. WAVE Sample Files
  20. java计算机毕业设计基于springboot小区物业管理系统

热门文章

  1. SpringBoot-国际化
  2. Dubbo 服务订阅源码分析
  3. 小程序技术,打开跨端管理的思路,提高客户满意度和忠诚度
  4. 2021年中国白酒行业现状及趋势分析:产品需求向中高端类走[图]
  5. 18年高新计算机考证初级查询
  6. 阿里云入主千方科技,顺道搞定宇视科技
  7. python开发windows界面_pyui4win
  8. Sequelize 大于_巴中塔吊防雷接地系统接地电阻不大于_科杰防雷
  9. 基于 mesos 的容器调度框架
  10. 以太坊ETH-智能合约开发-solidity源码分析-truffle进阶