理解海明校验法
奇偶校验法只能发现错误,而不能找到错误在哪里,进而没有纠错功能。
为了能找到发现错误的位置,而有了海明校验法。
海明校验码分为两个部分:n个有效信息位(用DnDn-1...D1表示),k个校验位(用PkPk-1...P1表示)。
n与k的关系是:n+k≤2k-1。因为k个校验码可以表示2k个状态,其中一个状态表示正确状态,其他的用于表示是哪一位(包括有效信息位和校验位)发生了错误。
这个基本思路还是比较好理解的,但奈何书还是看不懂。
下面是我经过思考后的,比较说得通的海明校验法理解法。
现有有效信息位D4D3D2D1,n=4,则k=3,校验位为P3P2P1,形成7位海明校验码H7H6H5H4H3H2H1。
为了检查接收到的海明校验码是否正确,方法就是再计算一遍校验位P3'P2'P1',与P3P2P1比较,如果不同,代表发生了错误。
比较结果有8种情况,即:
P1'!=P1 | P2'!=P2 | P3'!=P3 |
否 | 否 | 否 |
否 | 否 | 是 |
否 | 是 | 否 |
否 | 是 | 是 |
是 | 否 | 否 |
是 | 否 | 是 |
是 | 是 | 否 |
是 | 是 | 是 |
表1
P1'是否不等于P1,可以用逻辑运算异或来表示——不等为1,相等为0。
设Si = Pi' xor Pi,则上表可以表示为:
S3 | S2 | S1 |
0 | 0 | 0 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 1 |
表2
对于这8种状态,除了000用于表示没有错误之外,其它每种状态应表示海明校验码的某一位发生了错误:
S3 | S2 | S1 | 含义 |
0 | 0 | 0 | 没有错误 |
0 | 0 | 1 | H1发生错误 |
0 | 1 | 0 | H2发生错误 |
0 | 1 | 1 | H3发生错误 |
1 | 0 | 0 | H4发生错误 |
1 | 0 | 1 | H5发生错误 |
1 | 1 | 0 | H6发生错误 |
1 | 1 | 1 | H7发生错误 |
表3
三个校验位本身也可能发生错误,为了直观表示,将001、010、100表示为P1、P2、P3发生了错误。那么对应地,它们分别在海明校验码中占据H1、H2、H4三个位,其余的位分配给有效信息位。如下:
海明校验码 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
实际分配 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
表4
接着分析有效信息位发生错误的情况:
S3 | S2 | S1 | 含义 |
0 | 1 | 1 | H3发生错误 |
1 | 0 | 1 | H5发生错误 |
1 | 1 | 0 | H6发生错误 |
1 | 1 | 1 | H7位发生错误 |
表5
可以看出:
- H3应该是计算P2和P1的因子,即如果H3发生变化,则P2和P1就相应发生变化,从而导致S2和S1变为1。
- H5应该是计算P3和P1的因子,即如果H5发生变化,则P3和P1就相应发生变化,从而导致S3和S1变为1。
- H6应该是计算P3和P2的因子,即如果H6发生变化,则P3和P2就相应发生变化,从而导致S3和S2变为1。
- H7应该是计算P3、P2和P1的因子,即如果H7发生变化,则P3、P2和P1就相应发生变化,从而导致S3、S2和S1变为1。
因此由以下对应关系:
校验位 | H3 | H5 | H6 | H7 |
P1 | √ | √ | √ | |
P2 | √ | √ | √ | |
P3 | √ | √ | √ |
表6
可以发现,表5和表6就是一个旋转关系。
表6可表示为:
- P3 = f(H5,H6,H7)
- P2 = f(H3,H6,H7)
- P1 = f(H3,H5,H7)
那么这个f法则具体是怎样的呢?虽然书上说的是异或操作,但我觉得不是异或操作也没关系。只要保证一旦其中一个因子发生变化,计算结果就发生变化即可。
综上,海明校验法的原理就是对校验结果的8种状态的分配,而校验位的计算只要注意与特定的有效信息位相关联即可,校验法则只要记住官方(姑且这么叫吧)使用的是异或即可。