编码
p1 ~ p4是汉明校验码,d1 ~ d8为要传输的数据
根据图表 p1对应(0001)b,p2对应(0010)b,p3对应(0100)b,p4对应(1000)b
将d1 ~ d8根据p1 ~ p4,分成4组
p1组有:(位置号)1 3 5 7 9 11(bit0 都是1)
p2组有:2 3 6 7 10 11(bit1 都是1)
p3组有: 4 5 6 7 12
p4组有:8 9 10 11 12
「以偶校验为例」,p1 p2 p3 p4要保证每组中1的个数为偶数个
假设数据为0000_1111
根据分组,可以得出:p1 = 0, p2 = 0, p3 = 1, p4 = 0
则编码后的数据为:0001_0000_1111
校验
例1
如果收到的数据为「0001_0000_1111」
按照与编码相同的分组方式对c1 ~ c4分组,并将接收到的数据根据分组进行奇偶校验
对c1组的1 3 5 7 9 11位置奇偶校验,结果为0
对c2组的2 3 6 7 10 11位置奇偶校验,结果为0
对c3组的4 5 6 7 12位置奇偶校验,结果为0
对c4组的8 9 10 11 12位置奇偶校验,结果为0
四个校验位结果都为0,说明数据传输没有发生错误
例2
如果收到的数据为「0001_0000_1101」(将第11位翻转)
c1组奇偶校验结果为1
c2组奇偶校验结果为1
c3组奇偶校验结果为0
c4组奇偶校验结果为1
{c4, c3, c2, c1} = 1011,对应第11位,在传输的过程中,第11位发生错误
例3
如果收到的数据为「0001_0000_1001」(将第10、11位翻转)
c1组奇偶校验结果为1
c2组奇偶校验结果为0
c3组奇偶校验结果为0
c4组奇偶校验结果为0
{c4, c3, c2, c1} = 0001,汉明码显示的位置与实际位置不符合,无法定位到具体位置
那如果想检测到2 bit error应该如何处理
2 bit error检测
为编码后的数据额外增加一个奇偶校验位
还是上面的例子为例,增加一奇偶校验位
加上奇偶校验位后的编码为 0_0010_0001_1111
例4
如果收到的数据是「0_0010_0001_0011」(将第10、11位翻转)
c1组奇偶校验结果为1
c2组奇偶校验结果为0
c3组奇偶校验结果为0
c4组奇偶校验结果为0
整体校验结果为0
整体校验通过,但汉明校验为通过,有2 bit error
例5
如果收到的数据是「0_0010_0001_0011」(将第11位翻转)
1组奇偶校验结果为1
c2组奇偶校验结果为1
c3组奇偶校验结果为0
c4组奇偶校验结果为1
整体校验结果为1
整体未通过,汉明检验也未通过,有 1 bit error
例6
如果收到的数据是「0_0010_0001_1111」
c1组奇偶校验结果为0
c2组奇偶校验结果为0
c3组奇偶校验结果为0
c4组奇偶校验结果为0
整体校验结果为0
整体通过,汉明检验也通过, 没有error
总结
整体奇偶校验未通过,汉明校验未通过,有1 bit error并可纠正
整体奇偶校验通过,汉明校验未通过,有2 bit error且不可纠正
整体奇偶校验通过,汉明校验通过,没有error