- 汉明码简介:汉明码又叫海明码是在1950年被Richard Hamming提出的,目前仍是广泛采用的一种有效的校验码。汉明码实际上是一种多重奇偶校验。
- 校验原理:在有效信息位中加入几个校验位形成汉明码,使码距比较均匀地拉大,并把汉明码的每一个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错误,还可以指出错误发生的位置,为自动纠错提供了依据。
- 海明码能检测出2位错误,并能纠正1位错误
- 汉明码纠错应满足的条件:设K为有效信息的位数,r为校验位的位数,则整个码字的位数N应满足不等式:N=K+r ≤2r-1(是2的r次方)。若要求海明码能检测出2位错误,则再增加1位校验位。
- 计算海明码的步骤:
A、确定海明码校验位的位数
设K为有效信息的位数,r为校验位的位数,则整个码字的位数N应满足不等式:N=K+r ≤2r-1(是2的r次方)。若要求海明码能检测出2位错误,则再增加1位校验位。
例如:二进制编码位10101100,共8位所以K=8,可以得出校验位r的位数为4位。
B、确定校验位的位置
位号(1~N)是那些权值为2的那些位,即2^0、2^1、2^2、……、2^r-1的位置作为校验位,记作P1、P2、P3、……、Pr余下的为有效信息位。
校验位P1=2^(1-1)其他校验位同理。
D8D7D6……D2D1对应数据10101100
海明码 | P5 | D8 | D7 | D6 | D5 | P8 | D4 | D3 | D2 | P4 | D1 | P2 | P1 |
位号 | H13 | H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
数据填入 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | |||||
求得的海明码 |
C、分组
将N位分为r组,第i位由校验位号之和等于i的那些校验位所校验。
个人是这样分组的(Pi校验的位是从Mi开始连续i位,然后间隔i位,再校验连续i位,再间隔…….)
海明码 | P13 | D8 | D7 | D6 | D5 | P8 | D4 | D3 | D2 | P4 | D1 | P2 | P1 |
位号 | H13 | H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
校验位P8 | ✔ | ✔ | ✔ | ✔ | ✔ | ||||||||
校验位P4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||||||||
校验位P2 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
校验位P1 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
由表可以看出:
P1校验数据位 H1,H3,H5,H7,H9,H11,…
P2校验数据位 H2,H3,H6,H7,H10,H11,…
P4校验数据位 H4,H5,H6,H7,H12,…
P8校验数据位 H8,H9,H10,H11,H12,…(注意:P的下标对应的是海明码的下标)
D、校验位的形成
校验位的形成是由海明码的所有位求异或得到的例如:
P1=H1⊕H3⊕H5⊕H7⊕H9⊕H11
P2=H2⊕H3⊕H6⊕H7⊕H10⊕H11
P4=H4⊕H5⊕H6⊕H7⊕H12
P8=H8⊕H9⊕H10⊕H11⊕H12
为了能检验两个错误,增加一位校验位Pr+1,放到最高位。
Pr+1=所有位求异或
例子:求10101100的海明码
海明码 | P5 | D8 | D7 | D6 | D5 | P8 | D4 | D3 | D2 | P4 | D1 | P2 | P1 |
位号 | H13 | H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
数据填入 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | |||||
求得的海明码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
P1=H1⊕H3⊕H5⊕H7⊕H9⊕H11
=1⊕0⊕0⊕1⊕0⊕1=1
P2=H2⊕H3⊕H6⊕H7⊕H10⊕H11
=0⊕1⊕1⊕1⊕0=1
P4=H4⊕H5⊕H6⊕H7⊕H12
=0⊕1⊕1⊕1=1
P8=H8⊕H9⊕H10⊕H11⊕H12
=0⊕1⊕0⊕1=0
将数据填入表中即可得到最终的海明码,但是为了检验2给错误,我们再把求得的海明码的所有位在求一次异或
P13=1⊕0⊕1⊕0⊕0⊕1⊕1⊕0⊕1⊕0⊕1⊕1=1
-
海明码纠错
现在假设第5位出错了,也就是第五位在传输的过程中被改为“1“了(D5由0变为1)。即得到的数据为(1 1011 0110 1011)。现在要找出错误的位置(假设现在不知道出错的位置)。
S1=P1⊕D1⊕D2⊕D4⊕D5⊕D7 = 1
S2=P2⊕D1⊕D3⊕D4⊕D6⊕D7 = 0
S3=P4⊕D2⊕D3⊕D4⊕D8 = 0
S4=P8⊕D5⊕D6⊕D7⊕D8 = 1
S5=Pv⊕D1⊕D2⊕D3⊕D5⊕D6⊕D8 = 0
然后将S5S4S3S2S1 = 01001 转为十进制 = 9,即求得(1 1011 0110 1011)第9位出错,将1改为0完成纠错