汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。
汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置
1、这里使用字母 D 代表数据。
2、这里使用字母 P 代表在数据中插入的校验码。
3、
这里使用字母 H 代表插入校验码后的所有数据
---------------------------------------------------------------------------
一、计算校验位的个数
举个例子:
假设数据位为: 101101001 共9位
根据公式:
所以D = 4, 即 9 个数据位需要 4 位校验位。
---------------------------------------------------------------------------
二、计算校验位的位置
校验码的位置依次是:
第1个:2的0次方(第 1 个位置)
第2个:
2的1次方
(
第 2 个位置
)
第3个:
2的2次方
(
第 4 个位置
)
第4个:
2的3次方
(
第 8 个位置
)
第5个:
2的4次方
(
第 16 个位置
)
第6个:
2的5次方
(
第 32 个位置
)
......
,其他位置上就是数据位
最后得到的海明码的位置排序是:(P 代表校验码,D 代表数据、排列从右往左)
D8、
D7、
D6、
D5、
D4、
P4、
D3、
D2、
D1、
P3、
D0、
P2、
P1
所以,带入数据位得:
1、0、0、1、0、P4、1、1、0、P3、1、P2、P1
---------------------------------------------------------------------------
三、最后就是要计算出校验码具体的值了
既然是校验码,肯定是用来校验数值的。
(校验取值方法:海明码【特别强调,海明码的第几位,不是校验码的第几位】的第几位就取几位跳几位,包括自身。
比如p1在第一位,就取一位,再跳过一位;
比如p3在第四位,就取四位,再跳过四位)
p1校验:p1、1、0、1、0、0、1
p2校验:p2、1、1、1、1、0
p3校验:p3、0、1、1、0、1
p4校验:p4、0、1、0、0、1
之后有两种校验方法分别确定 p1、p2、p3、p4 的值(奇校验和偶校验)
奇校验:保证 1 的个数为奇数个
偶校验:保证 1 的个数为偶数个
这里采用偶校验的方法:
p1校验:共有 3 个 1 ,即 奇数个 1 ,偶校验为 p1 = 1
p2校验:共有 4 个 1 ,即 偶数个 1 ,偶校验为 p2 = 0
p3校验:共有 3 个 1 ,即
奇数
个 1 ,偶校验为 p3 = 1
p4校验:共有 2 个 1 ,即 偶数个 1 ,偶校验为 p4 = 0
所以最终的海明码的值为:
1、0、0、1、0、0、1、1、0、1、1、0、1
参考文档:
你看得懂的海明码校验和纠错原理(一)