一文看懂海明校验码及其计算方法(详细总结)

网上看了好几篇文章后终于算是捋明白了,但是看到的这些资源要么说得云里雾里,要么干脆说得有问题(然后还被点了好多赞。。。),无论如何这些都容易误导小白。作为C站多年老潜水员,我还是把海明校验码的要点总结分享一下吧。

1. 海明码的特点:m+k\leq 2^k-1

其中m表示数据位的位数,k表示海明校验码的位数

k位海明校验码一共可以表示2^k种校验信息结果,其中有一种要用来表示没有出错的情况,则其余还剩2^k-1种结果,为了使校验结果可以指出任一位出错的位置,则需要满足以上不等式。

2. 举例说明:

发送端:

设要传输的数据为101101100

(1)可知m=9,由公式m+k\leq 2^k-1,可知k最小值为4,所以总共要传输的数据位数为9+4=13;

(2)海明校验码放在索引号为2^n的位(n=0,1,2,...,k-1)上,本例中k=4,所以校验位的索引为第1,2,4,8位,于是在下表中把这几位空出来

索引号

1

2

3

4

5

6

7

8

9

10

11

12

13

H1

H2

1

H4

0

1

1

H8

0

1

1

0

0

(3)列出进制转换表:

索引号

8(2^3

4(2^2)  

2(2^1) 

1(2^0) 

3

0

0

1

1

5

0

1

0

1

6

0

1

1

0

7

0

1

1

1

9

1

0

0

1

10

1

0

1

0

11

1

0

1

1

12

1

1

0

0

13

1

1

0

1

上表中,先说每一行的内容:从第二行开始,每一行的第一列代表索引号,这个索引号是除去了海明校验位之外的其他所有位。后面几列为该索引对应的二进制表示,其位数取决于第(1)步计算得出的海明校验码的位数,比如第二行,索引号是3,十进制3对应的二进制就是0011,之所以用4位表示是因为这段信息码需要4个海明校验位。

再看列信息:第一行最右边数字1所对应的列里,出现1的,就表示可以用第H1位完成校验,出现数字0则表示不能用H1位进行校验,因此,由上表可知:

校验位H1负责校验:第3,5,7,9,1113位(上表黄色高亮显示部分)对应位置上的值进行异或得:1⊕0⊕1⊕0⊕1⊕0=1,由于海明校验做的是偶校验,则H1=1

校验位H2负责校验:第3,6,7,10,11位(上表蓝色高亮显示部分)对应位置上的值进行异或得:1⊕1⊕1⊕1⊕1=1
校验位H4负责校验:第5,6,712,13对应位置上的值进行异或得:0⊕1⊕1⊕0⊕0=0
校验位H8负责校验:第9,10,1112,13对应位置上的值进行异或得:0⊕1⊕1⊕0⊕0=0

(4)得到最终要传输的数据串为

索引号

1

2

3

4

5

6

7

8

9

10

11

12

13

1

1

1

0

0

1

1

0

0

1

1

0

0

接收端:

(1)进行校验:

若此时接收方收到的数据相比源数据,在第11位发生了错误:

索引号

1

2

3

4

5

6

7

8

9

10

11

12

13

1

1

1

0

0

1

1

0

0

1

0

0

0

接收方先按照第③步中类似的方式进行计算校验,区别在于要加上校验位自身这一位,即:

C1的值为第H1,3,5,7,9,11,13位上的值进行异或,计算结果为1

C2的值为第H2,3,6,7,10,11位上的值进行异或,计算结果为1

C4的值为第H4,5,6,712,13位上的值进行异或,计算结果为0

C8的值为第H8,9,10,1112,13位上的值进行异或,计算结果为1

(2)错误位判定:

由于海明校验采取的是偶校验,所以判断出C4监督式包含的数据位无错,错误位发生在C1,C2,C8三个监督式包含的位上。

此时的做法是:①找到C1,C2,C8这三个监督式共同包含的位;②找出共同包含的位之后,再剔除掉在C4中出现过的位(因为已经验证过C4监督式中的位是正确的);③剩下的位就是发生传输错误的位。

这三个监督式都包含第11位,同时C4监督式中没有第11位,因此出错的位就是第11位。

你可能感兴趣的:(css,算法,网络协议)