- 原文链接: https://chowyi.com/《程序员教程(第三版)》学习笔记——03.海明码/
- 版权声明: 文章采用 CC BY-NC-SA 4.0 协议进行授权,转载请注明出处!
海明码是利用奇偶性来检错和纠错的校验方法。在数据位之间插入r个校验位,通过扩大码距来实现检错和纠错。
海明校验
- 确定校验位的个数
设: N为待发送海明码的总位数,K是有效信息位数,r是校验位个数(分成r组作奇偶校验,能产生r位检错信息)
校验位的个数 r 应满足公式N=K+r ≤ 2^r-1
- 确定数据位与校验位在海明码中的位置。
在海明码中,校验位的位号为2^i,即1、2、4、8、16……其余部分用数据位填充。
- 通过校验关系,确定各校验位的值。
数据位的校验码确定:位号为i的校验码,是位号之和等i的数据位的校验位,如下表。
海明码每位所占用的校验位:
海明码位号 | 占用的校验位号 | 备注 |
---|---|---|
1 | 1 | 1=1 |
2 | 2 | 2=2 |
3 | 1, 2 | 3=1+2 |
4 | 4 | 4=4 |
5 | 1, 4 | 5=1+4 |
6 | 2, 4 | 6=2+4 |
7 | 1, 2, 4 | 7=1+2+4 |
8 | 8 | 8=8 |
9 | 1, 8 | 9=1+8 |
10 | 2, 8 | 10=2+8 |
11 | 1, 2, 8 | 11=1+2+8 |
每个校验位所校验的数位:
校验位位号 | 被校验位位号 |
---|---|
1P1 | 1, 3, 5, 7, 9, 11 |
2P2 | 2, 3, 6, 7, 10, 11 |
4P3 | 4, 5, 6, 7 |
8P4 | 8, 9, 10, 11 |
例如,对于7位的数据位,进行海明校验需要4个校验位。令数据位为D0、D1、D2……D6 。校验位为P1、P2、P3、P4 。形成的海明码为H1、H2、H3……H11 。
如下图:
H1 | H2 | H3 | H4 | H5 | H6 | H7 | H8 | H9 | H10 | H11 |
P1 | P2 | D0 | P3 | D1 | D2 | D3 | P4 | D4 | D5 | D6 |
P1偶校验:P1、D0、D1、D3、D4、D6
即P1=D0 xor D1 xor D3 xor D4 xor D6
P2偶校验:P2、D0、D2、D3、D5、D6
即P2=D0 xor D2 xor D3 xor D5 xor D6
P3偶校验:P3、D1、D2、D3
即P3=D1 xor D2 xor D3
P4偶校验:P4、D4、D5、D6
即P4=D4 xor D5 xor D6
若采用奇校验,则将各位校验位的偶校验值取反即可。
- 检验错误。做以下计算:
G1=P1 xor D0 xor D1 xor D3 xor D4 xor D6
G2=P2 xor D0 xor D2 xor D3 xor D5 xor D6
G3=P3 xor D1 xor D2 xor D3
G4=P4 xor D4 xor D5 xor D6
若采用偶校验,G4G3G2G1全为0时表示接收到的数据无错误(奇校验则应全为1)。当G4G3G2G1不全为0时说明发生了差错,而且G4G3G2G1的十进制值指出发生错误的位置。例如G4G3G2G1=1010,则说明H10(D5)出错了,取反即可纠正。
- 原文链接: https://chowyi.com/《程序员教程(第三版)》学习笔记——03.海明码/
- 版权声明: 文章采用 CC BY-NC-SA 4.0 协议进行授权,转载请注明出处!