汉明编码是一种可用于纠错的编码方式,通过增加很少的冗余位来达到纠正错误的目的。普通的汉明编码具有一位的纠错能力。
例子
最常见的汉明编码是4->7的:也就是说4位的数据+3位的纠错码,总共每次传输7位的数据,如果其中有一位翻转,我们也可以通过校验的方式准确得知是哪一位出错的。
假设待编码的数据是1011,编码过程见下表:
校验位1 | 校验位2 | 数据位1 | 校验位3 | 数据位2 | 数据位3 | 数据位4 | |
---|---|---|---|---|---|---|---|
校验位1 | 1^0^1 | 1 | 0 | 1 | |||
校验位2 | 1^1^1 | 1 | 1 | 1 | |||
校验位3 | 0^1^1 | 0 | 1 | 1 | |||
结果 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
上表的含义是:校验位1 = 数据位1 ^ 数据位2 ^ 数据位4
,依此类推。至于为什么是这样的,后面再讲。
由上表可知,1011的编码结果是0110011。假设数据在传输过程中第5位翻转了,变成了0110111。现在我们来校验汉明码:
校验位1 | 校验位2 | 数据位1 | 校验位3 | 数据位2 | 数据位3 | 数据位4 | 校验结果 | |
---|---|---|---|---|---|---|---|---|
校验位1 | 0 | 1 | 1 | 1 | 0^1^1^1=1 | |||
校验位2 | 1 | 1 | 1 | 1 | 1^1^1^1=0 | |||
校验位3 | 0 | 1 | 1 | 1 | 0^1^1^1=1 |
检验结果为101≠0,因此出错了,根据校验结果101(首位的1来自于校验位3)可知第5位出错了,与事实相符。
解释
鸽了鸽了,,有时间再写。。。