计网笔记:海明码(汉明码)

海明码(汉明码)

海明码是可以发现双比特错误,并可以纠正单比特错误的编码方案。(一般来讲,检错编码不一定具有纠错能力,但是纠错编码具有检错能力)。

其工作流程可以分为以下四个步骤:
(1)确定校验码位数r;
(2)确定校验码和数据的位置;
(3)求出校验码的值;
(4)检错并纠错。

在以下的工作流程中,我们要发送的数据D=101101.

工作流程

1、确定校验码位数r

我们使用海明不等式来确定校验码的位数r,海明不等式的形式如下:
2^r>=k+r+1
其中:
k为数据的位数(信息位数);
可以满足不等式的最小r为校验码的位数(冗余信息位数)

  • 解例:
    由海明不等式2^r>=k+r+1知:数据的位数为6位,校验码位数为4位。

2、确定校验码和数据的位置

在确定校验码P和数据D的位置的时候,我们的数据位按照1,2,3,…的顺序排布,按照下列原则:
(1)P1,P2,…,Pn:放在2的n(n>=0)次方的位置上;
(2)D1,D2,…,Dm:在校验码已经排放好的基础上,将D按序把剩下的空填满。

注意:P的值暂放不填,将D的值按位填进去。

  • 解例:
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 1 0 1 1 0 1

3、求出校验码的值

首先,在步骤的表格基础上,加上数据位对应的二进制,更改后的表格如下:

二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 1 0 1 1 0 1

接着按照如下的步骤操作:
(1)先找到P所对应的的二进制中1所在的位置
(2)再去看D中哪些数的对应位上的值也是1
(3)找到满足条件的D,再将P和这些D的实际值依次进行异或,令结果为等于0
(4)即可求出P(实际值)

  • 解例:
    按照以上步骤,可得:
    P1⊕D1⊕D2⊕D4⊕D5=0 ⇒P1=0
    P2⊕D1⊕D3⊕D4⊕D6=0 ⇒P2=0
    P3⊕D2⊕D3⊕D4=0 ⇒P3=0
    P4⊕D5⊕D6=0 ⇒P4=1

将P的值填入表中,得:

二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 0 0 1 0 0 1 1 1 0 1

由此,我们可以得到101101的海明码为 0010011101.

4、检错并纠错

在接收端,我们采用如下步骤进行判断所接收的数据串是否发生错误:
(1)按照前个步骤的做法。将P和对应的D(带入实际接收到值)进行异或
(2)将得到的结果按照倒序的方式进行排列
(3)排列好的结果,即数据出错位数的二进制值
(4)在找到出错位后,我们将其实际接收的值改为其相反的数即可。(1->0,0->1)

  • 解例:
    假设接收到的数据位0010111101,按照步骤进行判断。
    P1⊕D1⊕D2⊕D4⊕D5=1
    P2⊕D1⊕D3⊕D4⊕D6=0
    P3⊕D2⊕D3⊕D4=1
    P4⊕D5⊕D6=0

对应的位数的二进制表示为0101,即5.

所以第五位出错,我们将第五位的1改为0即可。

你可能感兴趣的:(计算机网络)