计算机系统基础知识——校验码之海明码(Hamming Code)
前言:海明码在传输的消息流中插入验证码,当计算机插入或者移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明码简单,被广泛应用于内存。
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 H1D7 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 H1D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P11 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 H1D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P11 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=C1A1=C2C2⊕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=C2C2⊕C1=A1⊕C1=B3
位置B3实际上是由位置B1与B2组合可得,由于组合方法多种多样,不能确定唯一位置。
总结:
1.海明码只能纠正一位错误
2.n位数据码,k位校验码的海明码必须满足关系2^k-1 >= n + k
计算机系统基础知识——校验码之海明码(Hamming Code)相关推荐
- 软件设计师教程(一)计算机系统知识-计算机系统基础知识
计算机系统基础知识 计算机系统硬件基本组成 中央处理单元 CPU的功能 CPU的组成 多核 CPU 数据表示 校验码 计算机系统硬件基本组成 计算机系统 = 硬件 + 软件 (协同工作运行) 计算机基 ...
- 软考 程序员教程-第一章 计算机系统基础知识
软考 程序员教程-第一章 计算机系统基础知识 为了督促自己学习,告别懒惰,在此先给自己定个小目标,请大家监督哟! 目标:一个月内过一遍<程序员教程>,下一个月开始上真题. 简单看了下,我在 ...
- 初级计算机信息处理员笔试题,初级信息处理技术员计算机系统基础知识考试卷模拟考试^题...
<初级信息处理技术员计算机系统基础知识考试卷模拟考试^题>由会员分享,可在线阅读,更多相关<初级信息处理技术员计算机系统基础知识考试卷模拟考试^题(9页珍藏版)>请在人人文库网 ...
- 微型计算机的必备部件,微型计算机系统基础知识
选填,简要介绍文档的主要内容,方便文档被更多人浏览和下载. 第2章 微型计算机系统基础知识 1.ROM的中文名称是______. A.软盘存储器 B.硬盘存储器 C.只读存储器 D.随机存储器 2.关 ...
- 计算机系统基础:校验码知识笔记
1.校验码概念 校验码主要是为了解决计算机各部件进行数据传输和交换,确保传送过程的正确无误,一是为了提高硬件电路的可靠性,二是提高代码的校验能力.通常会用校验码来检查传送的数据是否正确. 校验码编码分 ...
- 程序员教程-1章-计算机系统基础知识
觉得自己看第一章看了很长时间,才看了二.三十页,而且也是稀里糊涂的,先记下吧.(补记:稀里糊涂看完了,这章只考选择题,也就没深入了解,其实是了解一下头就大) 先记录一下目录结构,方便以后回忆内容. 本 ...
- 软考-嵌入式系统设计师-笔记:计算机系统基础知识
文章目录 数制及其转换 数据的表示 原码.反码.补码.移码 浮点数 奇偶校验 CRC校验 海明校验 计算机组成及主要部件的基本工作原理 计算机硬件组成 CPU组成 存储器 计算机体系结构 冯诺依曼结构 ...
- 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)
1.1计算机系统的组成 1.1.1计算机发展概述 1.大型机阶段 1946年美国研制的第一台计算机ENIAC被公认为大型机的鼻祖. 大型机(mainframe)的发展经历了一下几代: 第一代采用电子管 ...
- 【软考一】计算机系统基础知识(要多做题)
软设之计算机网络概论 一.计算机的基本组成 1.计算机组成逻辑图 2.计算机部件作用 (1)一级部件作用 (2)二级部件作用 二.CPU 1.CPU组成 2.CPU作用 三.计算机的基本单位与进制 1 ...
最新文章
- Kafka配置SSL(云环境)
- python怎么导入文本-如何导入其他Python文件?
- ng-repeat 设定select 选择项
- Linux卸载minikube命令整理
- Android系统下内存使用情况与监测
- Qt resizeEvent 控件居中设置
- MySQL不香吗,为啥京东放弃它拥抱Elasticsearch?
- (四)微调ResNet50以诊断COVID-19
- java的gc策略_Java的GC与内存分配策略
- syslog收到的日志存放在哪里_【Python】Syslog日志服务器开发amp;部署(12.5更新)
- MyBatis学习后篇
- 你对云存储的安全性了解多少?
- pyecharts在jupyter notebook中使用报错
- vm15设置成中文界面
- CentOS cp 复制隐藏文件提示 cp: cannot stat ?.xxx*?. No such file or directory
- u8如何备份文件服务器,用友u8 数据备份到云服务器
- CodeForces 1305C-Kuroni and Impossible Calculation(抽屉原理)
- 【python数据分析】对淘商品类母婴购物数据进行分析(含完整源码)
- 3d稀疏卷积——spconv源码剖析(一)
- 为什么只看重结果_只注重结果不注重过程的话
热门文章
- Android内核开发:在源码树中添加新的app应用
- 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
- 深度学习自学(二):人脸检测MTCNN学习总结
- el-menu实现路由跳转及当前页的导航
- .netcore 和 java_Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
- git学习(五)分支操作和解决冲突
- python函数定义中参数列表里的参数是_python-函数(def)参数 及参数解构 变量 知识整理...
- java 单选按钮怎么重置_单选框-复选框重置的方法
- java代码post接口请求 用 hutool工具类
- 打印机显示rpg服务器不可用,网络打印机“RPC服务器不可用”的终极解决办法