以最多只有一位出错为前提进行说明
1.校验位的位数的确定:
数据位为n位,校验位有k位,传输过程中最多只有1位出错,所以出错的情况总共n+k种,正确的情况有1种,所以
校验位要能表示所有的情况即
2^k >= n + k + 1
2.海明校验码的规则:
a.如果故障字(定义见下说明)各位全为0,则表示没有发生错误
b.如果故障字中有且仅有一位为1,则表示校验位出错,不需要纠正,且故障字的数值即为出错位的下标(从1开始),即校验位的下标
c.如果故障字中多位为1,则表示有一个数据位出错,其在码字中的出错位置下标即使故障字的数值(注意这里的下标从1开始),只需将出错位取反即可纠正。
3.举例说明
假设n为8, 则2^4 >= 8 + 4 + 1,校验位为4位,P4 P3 P2 P1 为接收到的校验位,P4' P3' P2' P1'根据接收到的数据位D8~D1重新计算的校验位,故障字的定义为:S4 S3 S2 S1 = P4 P3 P2 P1 ^ P4' P3' P2' P1' (按位异或),根据规则b,可以确定P1 P2 P3 P4在整个12位码字中的 位置(0001 0010 0100 1000)即(1, 2, 4, 8 位为校验码,剩余数据位按顺序插入),最终得到整个码字的排序
D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
由这个顺序可以推出P1 P2 P3 P4 是哪几位数据的奇偶校验(这里采用偶校验)
D1的位置为3,(0011),按照上述规则c,即出错时故障字S4S3S2S1为0011,即D1为出错时 要改变 P1所在的组 和 P2 所在的组的奇偶性,即D1同时在P1组和P2组中,以此类推D2在P1组和P3组中 …… 一直到D8
最终得到结果,(这里采用偶校验,奇校验的话再⊕1)
P1 = D1⊕D2⊕D4⊕D5⊕D7
P2 = D1⊕D3⊕D4⊕D5⊕D7
P3 = D2⊕D3⊕D4⊕D8
P4 = D5⊕D6⊕D7⊕D8
最终故障字的求解公式 S4 S3 S2 S1 = P4 P3 P2 P1 ^ P4' P3' P2' P1' 可以拆开
S1 = P1⊕D1⊕D2⊕D4⊕D5⊕D7
S2 = P2⊕D1⊕D3⊕D4⊕D5⊕D7
S3 = P3⊕D2⊕D3⊕D4⊕D8
S4 = P4⊕D5⊕D6⊕D7⊕D8
即接收端接收到码字可以按照上述公式求出故障字,根据故障字的意义进行纠错,按照上述规则a ,b, c