前言:海明码在传输的消息流中插入验证码,当计算机插入或者移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明码简单,被广泛应用于内存


1. 海明码

  海明码是由贝尔实验室的Richard Hamming设计的,是一种利用奇偶性来检错和纠错的方法。海明码的构成方法是在特定的数据位之间插入k个校验位通过扩大码距来实现检错和纠错。

  • 奇偶性错
      根据之前讲述奇偶校验码的文章可知,利用奇偶性纠错的方法主要是利用位异或的方法。
  • 特定数据位
      海明码中的校验码所在的特定的数据位是指2的幂次方的位置,比如第1、2、4、8位等等。

2. 编码方法

2.1 位置标记

  以1010110的数据为例,将其每一位分别进行标注
D7D6D5D4D3D2D11010110D_7\space D_6\space D_5\space D_4\space D_3\space D_2\space D_1\space \\ 1\space\space\space\space 0\space\space\space\space1\space\space\space\space 0\space\space\space\space 1\space\space\space\space1\space\space\space\space 0 D7​ D6​ D5​ D4​ D3​ D2​ D1​ 1    0    1    0    1    1    0
  在编码时需要明确以下几点:

  • 海明码是原数据码+校验码
  • 每个校验码的位置是2的幂次方,比如第1、2、4、8位

  则可以从左往右方向得到如下标注:
H11H10H9H8H7H6H5H4H3H2H1D7D6D5P4D4D3D2P3D1P2P1H_{11}\space H_{10}\space H_9\space H_8\space H_7\space H_6\space H_5\space H_4\space H_3\space H_2\space H_1 \\ D_7\space\space D_6\space\space D_5\space P_4\space D_4\space\ D_3\space D_2\space P_3\space D_1\space P_2\space P_1 H11​ H10​ H9​ H8​ H7​ H6​ H5​ H4​ H3​ H2​ H1​D7​  D6​  D5​ P4​ D4​  D3​ D2​ P3​ D1​ P2​ P1​
(其中,H为海明码的位置标注,P为校验码的位置标注。)

2.2 原始数据

  我们将原始数据以及校验码(初始化为0)填入海明码的位置,得到如下数据:
H11H10H9H8H7H6H5H4H3H2H1D7D6D5P4D4D3D2P3D1P2P11010‾0110‾00‾0‾H_{11}\space H_{10}\space H_9\space H_8\space H_7\space H_6\space H_5\space H_4\space H_3\space H_2\space H_1 \\ D_7\space\space D_6\space\space D_5\space P_4\space D_4\space\ D_3\space D_2\space P_3\space D_1\space P_2\space P_1 \\ 1\space\space\space\space\space 0\space\space\space\space\space 1\space\space\space\space \underline{0}\space\space\space\space 0\space\space\space\space 1\space\space\space\space 1\space\space\space\space \underline{0}\space\space\space\space 0\space\space\space\space \underline{0}\space\space\space\space \underline{0} H11​ H10​ H9​ H8​ H7​ H6​ H5​ H4​ H3​ H2​ H1​D7​  D6​  D5​ P4​ D4​  D3​ D2​ P3​ D1​ P2​ P1​1     0     1    0​    0    1    1    0​    0    0​    0​
此时初始校验码P4P3P2P1为0000。

2.2 校验码生成操作

  校验码的生成公式为:
新的校验码 = 上一次校验码 ⊕(当前数据位 &在海明码中的位置)\text{新的校验码 = 上一次校验码 }\oplus \text{(当前数据位 } \& \text{ 在海明码中的位置)} 新的校验码 = 上一次校验码 ⊕(当前数据位 & 在海明码中的位置)
 以上述数据为例,逐位计算校验码:

  • D1
    此时上一次校验码为 0000,当前数据位D1为0,在海明码中占的位置是H3(即位置码为0011),三者异或后得新的校验码为0000 = 0000 ^ (0 & 0011).
  • D2
    此时上一次校验码为 0000,当前数据位D2为1,在海明码中占的位置是H5(即位置码为0101),三者异或后得新的校验码为0101 = 0000 ^ (1 & 0101).
  • D3
    此时上一次校验码为 0101,当前数据位D3为1,在海明码中占的位置是H6(即位置码为0110),三者异或后得新的校验码为0011 = 0101 ^ (1 & 0110).
  • D4
    此时上一次校验码为 0011,当前数据位D4为0,在海明码中占的位置是H7(即位置码为0111),三者异或后得新的校验码为0011 = 0011 ^ (0 & 0111).
  • D5
    此时上一次校验码为 0011,当前数据位D5为1,在海明码中占的位置是H9(即位置码为1001),三者异或后得新的校验码为1010 = 0011 ^ (1 & 1001).
  • D6
    此时上一次校验码为 1010,当前数据位D6为0,在海明码中占的位置是H10(即位置码为1010),三者异或后得新的校验码为1010 = 1010 ^ (0 & 1010).
  • D7
    此时上一次校验码为 1010,当前数据位D7为1,在海明码中占的位置是H11(即位置码为1011),三者异或后得新的校验码为0001 = 1010 ^ (1 & 1011).
  • 可得最终校验码为 0001.
      将其填入校验位可得最终海明码为:
    H11H10H9H8H7H6H5H4H3H2H1D7D6D5P4D4D3D2P3D1P2P11010‾0110‾00‾1‾H_{11}\space H_{10}\space H_9\space H_8\space H_7\space H_6\space H_5\space H_4\space H_3\space H_2\space H_1 \\ D_7\space\space D_6\space\space D_5\space P_4\space D_4\space\ D_3\space D_2\space P_3\space D_1\space P_2\space P_1 \\ 1\space\space\space\space\space 0\space\space\space\space\space 1\space\space\space\space \underline{0}\space\space\space\space 0\space\space\space\space 1\space\space\space\space 1\space\space\space\space \underline{0}\space\space\space\space 0\space\space\space\space \underline{0}\space\space\space\space \underline{1} H11​ H10​ H9​ H8​ H7​ H6​ H5​ H4​ H3​ H2​ H1​D7​  D6​  D5​ P4​ D4​  D3​ D2​ P3​ D1​ P2​ P1​1     0     1    0​    0    1    1    0​    0    0​    1​
    (注:海明码的校验和位置关系很大,上述校验过程数据是从左往右排列的。同样数据在从右往左排列情况下,校验码也不一样。)

3. 海明码校验特点分析

3.1 海明码校验位数确定

  通过之前的操作可以发现校验码和海明码每位数据位置息息相关,也就是相当于生成一个初始的海明码后,检查每位数据位,并将该位数据位进行异或处理。这就要求校验码必须能够表达出所有位置

  假设有n位数据,生成了k位校验码。分析可得最后生成的海明码是n+k位。k位数据能够表达的最大位置数值是2^k-1。若满足上述要求,校验码能够表达出所有位置信息,则必须有:
2k−1≥n+k2^k-1 \geq n+k 2k−1≥n+k
在上述数据位数为7位情况下,得出校验位为4位。

3.2 纠正一位错

  海明码纠正一位错误,实际上可以理解为异或操作的特点(AB=C,CB=A,C^A=B)。假设位置B是数据出错的那一位,A1是未计算位置B的校验码,算上位置B后(此时假设位置B为1),得到原始校验码C1。干扰出现后位置B的数据从1变为了0,此时检测端计算出来校验码为C2,与C1不同,两者进行异或计算之后可得位置B的信息,对该位进行取反纠错。
A1⊕B=C1A1=C2C2⊕C1=A1⊕C1=BA_1 \oplus B = C_1 \\ A_1 = C_2 \\ C_2 \oplus C_1 = A_1 \oplus C_1 = B A1​⊕B=C1​A1​=C2​C2​⊕C1​=A1​⊕C1​=B

  若出现两位或者两位以上的数错误,可得
A1⊕B1⊕B2=A1⊕B3=C1(设B1⊕B2=B3)A1=C2C2⊕C1=A1⊕C1=B3A_1 \oplus B_1 \oplus B_2 = A_1 \oplus B_3= C_1 \space\text{(设}B_1 \oplus B_2 = B_3\text{)} \\ A_1 = C_2 \\ C_2 \oplus C_1 = A_1 \oplus C_1 = B_3 A1​⊕B1​⊕B2​=A1​⊕B3​=C1​ (设B1​⊕B2​=B3​)A1​=C2​C2​⊕C1​=A1​⊕C1​=B3​
位置B3实际上是由位置B1与B2组合可得,由于组合方法多种多样,不能确定唯一位置。


总结
1.海明码只能纠正一位错误
2.n位数据码,k位校验码的海明码必须满足关系2^k-1 >= n + k

计算机系统基础知识——校验码之海明码(Hamming Code)相关推荐

  1. 软件设计师教程(一)计算机系统知识-计算机系统基础知识

    计算机系统基础知识 计算机系统硬件基本组成 中央处理单元 CPU的功能 CPU的组成 多核 CPU 数据表示 校验码 计算机系统硬件基本组成 计算机系统 = 硬件 + 软件 (协同工作运行) 计算机基 ...

  2. 软考 程序员教程-第一章 计算机系统基础知识

    软考 程序员教程-第一章 计算机系统基础知识 为了督促自己学习,告别懒惰,在此先给自己定个小目标,请大家监督哟! 目标:一个月内过一遍<程序员教程>,下一个月开始上真题. 简单看了下,我在 ...

  3. 初级计算机信息处理员笔试题,初级信息处理技术员计算机系统基础知识考试卷模拟考试^题...

    <初级信息处理技术员计算机系统基础知识考试卷模拟考试^题>由会员分享,可在线阅读,更多相关<初级信息处理技术员计算机系统基础知识考试卷模拟考试^题(9页珍藏版)>请在人人文库网 ...

  4. 微型计算机的必备部件,微型计算机系统基础知识

    选填,简要介绍文档的主要内容,方便文档被更多人浏览和下载. 第2章 微型计算机系统基础知识 1.ROM的中文名称是______. A.软盘存储器 B.硬盘存储器 C.只读存储器 D.随机存储器 2.关 ...

  5. 计算机系统基础:校验码知识笔记

    1.校验码概念 校验码主要是为了解决计算机各部件进行数据传输和交换,确保传送过程的正确无误,一是为了提高硬件电路的可靠性,二是提高代码的校验能力.通常会用校验码来检查传送的数据是否正确. 校验码编码分 ...

  6. 程序员教程-1章-计算机系统基础知识

    觉得自己看第一章看了很长时间,才看了二.三十页,而且也是稀里糊涂的,先记下吧.(补记:稀里糊涂看完了,这章只考选择题,也就没深入了解,其实是了解一下头就大) 先记录一下目录结构,方便以后回忆内容. 本 ...

  7. 软考-嵌入式系统设计师-笔记:计算机系统基础知识

    文章目录 数制及其转换 数据的表示 原码.反码.补码.移码 浮点数 奇偶校验 CRC校验 海明校验 计算机组成及主要部件的基本工作原理 计算机硬件组成 CPU组成 存储器 计算机体系结构 冯诺依曼结构 ...

  8. 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)

    1.1计算机系统的组成 1.1.1计算机发展概述 1.大型机阶段 1946年美国研制的第一台计算机ENIAC被公认为大型机的鼻祖. 大型机(mainframe)的发展经历了一下几代: 第一代采用电子管 ...

  9. 【软考一】计算机系统基础知识(要多做题)

    软设之计算机网络概论 一.计算机的基本组成 1.计算机组成逻辑图 2.计算机部件作用 (1)一级部件作用 (2)二级部件作用 二.CPU 1.CPU组成 2.CPU作用 三.计算机的基本单位与进制 1 ...

最新文章

  1. Kafka配置SSL(云环境)
  2. python怎么导入文本-如何导入其他Python文件?
  3. ng-repeat 设定select 选择项
  4. Linux卸载minikube命令整理
  5. Android系统下内存使用情况与监测
  6. Qt resizeEvent 控件居中设置
  7. MySQL不香吗,为啥京东放弃它拥抱Elasticsearch?
  8. (四)微调ResNet50以诊断COVID-19
  9. java的gc策略_Java的GC与内存分配策略
  10. syslog收到的日志存放在哪里_【Python】Syslog日志服务器开发amp;部署(12.5更新)
  11. MyBatis学习后篇
  12. 你对云存储的安全性了解多少?
  13. pyecharts在jupyter notebook中使用报错
  14. vm15设置成中文界面
  15. CentOS cp 复制隐藏文件提示 cp: cannot stat ?.xxx*?. No such file or directory
  16. u8如何备份文件服务器,用友u8 数据备份到云服务器
  17. CodeForces 1305C-Kuroni and Impossible Calculation(抽屉原理)
  18. 【python数据分析】对淘商品类母婴购物数据进行分析(含完整源码)
  19. 3d稀疏卷积——spconv源码剖析(一)
  20. 为什么只看重结果_只注重结果不注重过程的话

热门文章

  1. Android内核开发:在源码树中添加新的app应用
  2. 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
  3. 深度学习自学(二):人脸检测MTCNN学习总结
  4. el-menu实现路由跳转及当前页的导航
  5. .netcore 和 java_Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
  6. git学习(五)分支操作和解决冲突
  7. python函数定义中参数列表里的参数是_python-函数(def)参数 及参数解构 变量 知识整理...
  8. java 单选按钮怎么重置_单选框-复选框重置的方法
  9. java代码post接口请求 用 hutool工具类
  10. 打印机显示rpg服务器不可用,网络打印机“RPC服务器不可用”的终极解决办法