海明校验码

二进制数据在 传送、存取等环节,可能会发生 误码 (1变成0或0变成1). 如何发现并纠正 误码 ? 解决此类问题的思路是在原始数据(数码位)基础上增加几位校验位。常使用的检验码有三种. 分别是 奇偶校验码、海明校验码和循环冗余校验码(CRC)

其中 奇偶校验码 只能查是否有错误而无法纠错,且要求只能有一位出现错误。

为了能找到发生错误的位置,而有了 海明校验码

实际上本质来说, 海明码是升级款的奇偶校验码,其采用了一种非常巧妙的方式,把这串数字(即要传输的内容)分了组,通过分组校验来确定哪一位出现了错误

类似KMP算法,描述起来很麻烦,实际上使用起来却很简单

"海明"也被译为"汉明"


实例

数据位为8的数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 = 01101001 D_7D_6D_5D_4D_3D_2D_1D_0=01101001 </math>D7D6D5D4D3D2D1D0=01101001,求海明码

1.计算校验位的个数

设数据位为n位,校验位P为k位,则n和k必须满足以下关系:

<math xmlns="http://www.w3.org/1998/Math/MathML"> 2 k − 1 ≥ n + k 2^k - 1 ≥ n + k </math>2k−1≥n+k

此例中有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 k − 1 ≥ 8 + k 2^k - 1 ≥ 8 + k </math>2k−1≥8+k,可得k最小应为4,即 16 - 1 ≥ 8 + 4。

(奇偶校验称为 Parity Check,Parity Bit即奇偶校验位,故用P表示校验位)

2.计算校验位的位置

2.1 海明码的总位数

设校验位为P,数据位为D,海明码为H,则海明码H的位数为数据的位数校验码的位数相加,

在此即为 8+4 = 12 位

2.2 校验码的位置

校验位P 在海明码的第 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 i − 1 2^{i-1} </math>2i−1 位,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> H j = P i , j = 2 i − 1 H_j = P_i,j=2^{i-1} </math>Hj=Pi,j=2i−1,i从1开始计数。

无论是海明码、校验位还是数据位,均从右向左排列,即从低位向高位排列。

可先填入校验码的位置,再将数据位依次从低位到高位填入

如此例,i即为 1,2,3,4, 故有:


3.确定每个数据位 都由哪些校验码进行校验

根据 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 i − 1 2^{i-1} </math>2i−1 的公式,可知 <math xmlns="http://www.w3.org/1998/Math/MathML"> P 4 、 P 3 、 P 2 、 P 1 P_4、P_3、P_2、P_1 </math>P4、P3、P2、P1 的下标分别为8、4、2、1

确定 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 0 − D 7 D_0-D_7 </math>D0−D7 每个数据位都是由哪些校验码(P)进行校验的

数据位D的下标,等于其校验位的下标之和


4.计算校验码的值

校验码的值 为有参与校验的数据依次从低到高异或的值。

(异或:相同为0,相异为1)

因为 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 = 01101001 D_7D_6D_5D_4D_3D_2D_1D_0=01101001 </math>D7D6D5D4D3D2D1D0=01101001

<math xmlns="http://www.w3.org/1998/Math/MathML"> P 1 P_1 </math>P1 参与了 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 0 、 D 1 、 D 3 、 D 4 、 D 6 D_0、D_1、D_3、D_4、D_6 </math>D0、D1、D3、D4、D6 等数据位的校验。
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 2 P_2 </math>P2 参与了 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 0 、 D 2 、 D 3 、 D 5 、 D 6 D_0、D_2、D_3、D_5、D_6 </math>D0、D2、D3、D5、D6 等数据位的校验。
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 3 P_3 </math>P3 参与了 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 1 、 D 2 、 D 3 、 D 7 D_1、D_2、D_3、D_7 </math>D1、D2、D3、D7 等数据位的校验。
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 4 P_4 </math>P4 参与了 <math xmlns="http://www.w3.org/1998/Math/MathML"> D 4 、 D 5 、 D 6 、 D 7 D_4、D_5、D_6、D_7 </math>D4、D5、D6、D7 等数据位的校验。

所以:( <math xmlns="http://www.w3.org/1998/Math/MathML"> D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 = 01101001 D_7D_6D_5D_4D_3D_2D_1D_0=01101001 </math>D7D6D5D4D3D2D1D0=01101001)
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 1 = D 0 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 = 1 P_1 = D_0⊕D_1⊕D_3⊕D_4⊕D_6 = 1⊕0⊕1⊕0⊕1 = 1 </math>P1=D0⊕D1⊕D3⊕D4⊕D6=1⊕0⊕1⊕0⊕1=1
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 2 = D 0 ⊕ D 2 ⊕ D 3 ⊕ D 5 ⊕ D 6 = 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 1 = 0 P_2 = D_0⊕D_2⊕D_3⊕D_5⊕D_6 = 1⊕0⊕1⊕1⊕1 = 0 </math>P2=D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕1⊕1⊕1=0
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 3 = D 1 ⊕ D 2 ⊕ D 3 ⊕ D 7 = 0 ⊕ 0 ⊕ 1 ⊕ 0 = 1 P_3 = D_1⊕D_2⊕D_3⊕D_7 = 0⊕0⊕1⊕0 = 1 </math>P3=D1⊕D2⊕D3⊕D7=0⊕0⊕1⊕0=1
<math xmlns="http://www.w3.org/1998/Math/MathML"> P 4 = D 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 = 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0 P_4 = D_4⊕D_5⊕D_6⊕D_7 = 0⊕1⊕1⊕0 = 0 </math>P4=D4⊕D5⊕D6⊕D7=0⊕1⊕1⊕0=0


5.错误校验

确定错误校验 <math xmlns="http://www.w3.org/1998/Math/MathML"> G 4 G 3 G 2 G 1 G_4G_3G_2G_1 </math>G4G3G2G1,校验码有几位,错误校验就有几位。

如果采用偶校验 则结果全为0时没有错误,如果采用奇校验 则结果全为1时没有错误
<math xmlns="http://www.w3.org/1998/Math/MathML"> G 1 = P 1 D 0 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0 G_1 = P_1D_0⊕D_1⊕D_3⊕D_4⊕D_6 = 1⊕1⊕0⊕1⊕0⊕1 = 0 </math>G1=P1D0⊕D1⊕D3⊕D4⊕D6=1⊕1⊕0⊕1⊕0⊕1=0
<math xmlns="http://www.w3.org/1998/Math/MathML"> G 2 = P 2 D 0 、 D 2 、 D 3 、 D 5 、 D 6 = 0 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 1 = 0 G_2 = P_2D_0、D_2、D_3、D_5、D_6 = 0⊕1⊕0⊕1⊕1⊕1 = 0 </math>G2=P2D0、D2、D3、D5、D6=0⊕1⊕0⊕1⊕1⊕1=0
<math xmlns="http://www.w3.org/1998/Math/MathML"> G 3 = P 3 D 1 、 D 2 、 D 3 、 D 7 = 1 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 0 = 0 G_3 = P_3D_1、D_2、D_3、D_7 = 1⊕0⊕0⊕1⊕0 = 0 </math>G3=P3D1、D2、D3、D7=1⊕0⊕0⊕1⊕0=0
<math xmlns="http://www.w3.org/1998/Math/MathML"> G 4 = P 4 D 4 、 D 5 、 D 6 、 D 7 = 0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0 G_4 = P_4D_4、D_5、D_6、D_7 = 0⊕0⊕1⊕1⊕0 = 0 </math>G4=P4D4、D5、D6、D7=0⊕0⊕1⊕1⊕0=0

则 <math xmlns="http://www.w3.org/1998/Math/MathML"> G 4 G 3 G 2 G 1 = 00004 G_4G_3G_2G_1 = 00004 </math>G4G3G2G1=00004,表示没有异常。假如结果为0100则转为十进制为8,表示第八位存在异常。


海明码是一种纠错码,其方法是为需要校验的数据位增加若干校验位,使得校验位的值决定于某些被校位的数据,当被校数据出错时,可根据校验位的值的变化找到出错位,从而纠正错误。对于32位的数据,至少需要增加( )个校验位才能构成海明码。

以10位数据为例,其海明码表示为 D(0≤i≤9)表示数据位,P (1 ≤j≤4)表示校验位,数据位D由( )进行校验。


参考:

软考笔记--海明码

简单理解海明校验码

hamming code通俗易懂的解释

软考-计算机系统知识之海明码

白话------海明校验码及编码过程

理解海明校验法

【软考】校验码之详细总结

软考-海明码-单位错-冗余位数

相关推荐
飒飒真编程3 分钟前
C++类模板继承部分知识及测试代码
开发语言·c++·算法
GeminiGlory6 分钟前
算法练习6-大数乘法(高精度乘法)
算法
Linn8 分钟前
Spring WebSocket 服务实现的主流方案与最佳实践
spring boot·后端·spring
M1A123 分钟前
企业信息化管理(EIM):数字化转型的核心引擎
后端
熬了夜的程序员28 分钟前
【华为机试】HJ61 放苹果
算法·华为·面试·golang
马特说39 分钟前
基于随机森林的金融时间序列预测系统:从数据处理到实时预测的完整流水线
算法·随机森林·金融
呆呆的小鳄鱼40 分钟前
leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
算法·leetcode·华为
我是老孙1 小时前
Spring Boot 应用中,配置的加载优先级
spring boot·后端·pycharm
风象南1 小时前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
艾莉丝努力练剑1 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法