海明码(汉明码)
概念
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。——百度百科
编码方式
海明码可以对一位比特错误起到检错和纠错的作用,对于海明码的编码方式包涵以下几个过程
确定校验位数
在海明码中,校验位(\(x\))和信息位(\(y\))满足如下关系:
\[2^x \geq x +y \]根据此公式容易求出检验位和信息位的数量,有如下对应关系:
信息位位数 | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
---|---|---|---|---|---|---|
校验码位数 | 2 | 3 | 4 | 5 | 6 | 7 |
确定校验位位置
海明码中校验位位置是固定的均为2的幂次的位置(1,2,4,8,……)
确定校验位的值
海明码编码时对于每个校验位会将信息位分组,每一个校验位会覆盖多个信息位,对每个校验位其能覆盖的信息位有如下特点:
\[h为信息位地址\\ p为校验位地址\\ p\&q>0 \]对于每个校验位所覆盖的区域,采用校验方式确定校验码的值,一般为偶校验
纠错和检错
确定校验位数
在得到海明码之后,我们可以通过总位数来计算出相应的信息位和检验位各有多少,根据上述公式即可,同理即可得到校验位地址,并获得各个校验码
检错
假设各个校验码是由偶校验得到的,那么我们再次计算接收端的海明码对应的各个校验位的值,然后将新得到的校验位的值与发送来的值相比较,相同则证明该校验位覆盖的范围内的信息位全部是正确的,否则则该校验码所覆盖的范围内的信息位存在错误,通过各个校验码的比较我们可以确定那几个分组存在错误,通过查看分组的交集,便可以确定错误的信息位的位置
纠错
得到错误的信息位之后,对其取反即可
示例
发送端信息码:1010110
信息码位数为7,所以可以确定校验码位数为4,海明码总位数为11
校验码位置为:1,2,4,8
计算校验码的值:(偶校验方式)
\[p1 = 偶校验(h1,h3,h5,h7,h9,h11) = 0\\ p2 = 偶校验(h3,h6,h7,h10,h11) = 1\\ p4 = 偶校验(h5,h6,h7) = 1\\ p8 = 偶校验(h9,h10,h11) = 0\\ \]获得海明码为:01110100110
接收端海明码为:01110100111
确定校验位:1,2,4,8
计算校验码值:
\[p1 = 偶校验(h1,h3,h5,h7,h9,h11) = 1\\ p2 = 偶校验(h3,h6,h7,h10,h11) = 1\\ p4 = 偶校验(h5,h6,h7) = 0\\ p8 = 偶校验(h9,h10,h11) = 1\\ \]由此确定错误位为11位,因为特殊的分组方式,所以这里计算结果从高位开始排出为1011(二进制)=11,也可确定错误位