汉明码:校验位、单比特纠错与完整实例

2026/08/19

汉明码是一类通过增加多个校验位来定位并纠正错误的编码。接收端重新计算各组奇偶校验,把通过或失败的结果组合为一个二进制“地址”,称为伴随式。如果传输或存储过程中只有一个比特翻转,这个地址会直接指出错误位置,接收端无需请求重传就能修复数据。

最经典的例子是 Hamming(7,4):四个数据位加上三个校验位,形成七位码字。下面将完整说明位布局、编码、故障注入和纠错过程,并解释基本形式为什么不能可靠处理双比特错误,以及 SECDED 如何利用额外的总校验位补上检测能力。

汉明码解决什么问题

通信链路和存储介质可能因噪声、弱存储单元、辐射或时序故障而改变某一位。一个普通奇偶校验位可以发现奇数个比特发生变化,却不能说明哪一位出错。汉明码让多个校验组互相重叠,使码字中的每个位置都具有唯一的“参与校验组合”。

每个校验只返回通过或失败,但所有结果合在一起就能编码一个位置。这是其核心思想:校验位不仅发出错误警报,还共同指向受损比特。

这种方法属于前向纠错。发送端预先加入冗余,接收端根据预期错误模型自行修复,与“发现错误后要求重传”是不同策略。

汉明距离与纠错能力

两个等长比特串之间不同位置的数量称为汉明距离。例如 101101100001 有两位不同,因此距离为 2。

编码中任意两个有效码字之间的最小距离决定其保证能力:

最小距离可保证能力
2检测一个比特错误
3纠正一个比特错误
4纠正一个比特错误,并检测两个比特错误

基本汉明码的最小距离为 3。有效码字彼此足够远,一个比特翻转后的接收结果仍只会最接近某个唯一有效码字。再增加一个覆盖整个码字的总校验位,最小距离可扩展到 4,形成常说的 SECDED,即单错纠正、双错检测。

需要多少个校验位

设数据位数量为 m,校验位数量为 r。所有数据位、校验位以及“没有错误”这一种结果都必须能由 r 位校验结果区分,因此需要满足:

2^r >= m + r + 1

m = 4 时,两个校验位不够,因为 2^2 = 4,小于 4 + 2 + 1 = 7。三个校验位刚好够用,因为 2^3 = 8,等于 4 + 3 + 1。所以四位数据会形成七位码字。

当数据有 11 位时,四个校验位满足 2^4 = 11 + 4 + 1,得到 Hamming(15,11)。记法中的前一个数表示总码长,后一个数表示有效数据长度。

校验位为什么放在二的幂位置

从 1 开始给码字位置编号,把 1、2、4、8 等二的幂位置留给校验位,其余位置依次放数据。

Hamming(7,4) 的布局如下:

位置1234567
用途P1P2D1P4D2D3D4

把每个位置编号写成二进制,就能看到校验组的规律:

位置二进制地址参与的校验
1001P1
2010P2
3011P1、P2
4100P4
5101P1、P4
6110P2、P4
7111P1、P2、P4

P1 检查地址最低位为 1 的位置,即 1、3、5、7;P2 检查地址第二位为 1 的位置,即 2、3、6、7;P4 检查地址第三位为 1 的位置,即 4、5、6、7。每个位置拥有唯一的校验组组合,因此错误结果可以反推出位置编号。

Hamming(7,4) 完整编码示例

下面用偶校验编码数据 1011。先把四个数据位放入 3、5、6、7:

位置1234567
数值P1P21P4011

计算 P1

P1 覆盖 1、3、5、7。已知数据为 1, 0, 1,其中有两个 1,已经满足偶数要求,因此 P1 取 0

计算 P2

P2 覆盖 2、3、6、7。已知三个数值均为 1,总数为奇数,因此 P2 取 1,把这一组的 1 增加到四个。

计算 P4

P4 覆盖 4、5、6、7。已知数据为 0, 1, 1,已经有两个 1,所以 P4 取 0

最终码字为:

位置:1 2 3 4 5 6 7
码字:0 1 1 0 0 1 1
结果:0110011

如果协议采用奇校验,布局和覆盖关系不变,只需让每一组最终包含奇数个 1。发送端与接收端必须使用相同约定。

如何定位并纠正单比特错误

假设第 5 位在传输中从 0 变为 1,接收结果为 0110111。接收端重新计算所有校验组,并把校验位本身包括在内:

校验覆盖位置结果
P11、3、5、7失败,XOR 结果为 1
P22、3、6、7通过,XOR 结果为 0
P44、5、6、7失败,XOR 结果为 1

按照 P4-P2-P1 排列结果:

P4 P2 P1 = 1 0 1
二进制 101 = 十进制位置 5

伴随式的值为 5,所以第 5 位发生错误。把它从 1 翻回 0,恢复 0110011,再取出位置 3、5、6、7,即可得到原数据 1011。学习过程中可以用二进制转十进制工具核对伴随式对应的位置值。

解码器的标准步骤

一个实用解码器通常执行以下流程:

  1. 接收固定位宽码字。
  2. 按约定的偶校验或奇校验重新计算每一组。
  3. 把失败结果组合成伴随式,每一项贡献自己的位置权重。
  4. 若结果非零且位于码长范围内,在单错模型下翻转对应位置。
  5. 移除二的幂位置,按约定顺序输出数据位。
  6. 如果有额外总校验位,必须先结合它区分单错和双错,再决定是否纠正。

校验计算本质上是多输入 XOR,可以由逻辑门指南中的异或电路并行实现。二进制数制指南则解释了二的幂位置为什么能形成唯一地址。

基本汉明码与 SECDED 的区别

基本形式保证纠正一个错误。若两位同时翻转,伴随式可能非零并指向第三个位置;盲目翻转该位置会把两个错误扩大为三个。仅靠七位码字无法可靠地区分所有双错和单错情况。

扩展形式增加一个覆盖基本码字的总校验位。接收端同时观察伴随式和总校验:

伴随式总校验解释
通过未检测到错误
非零失败地址指出一个错误,可纠正
失败总校验位本身出错
非零通过检测到双比特错误,不按单错纠正

这就是 ECC 内存中常见的 SECDED 行为:纠正任意单比特错误,检测但不能修复双比特错误。连续突发错误、整颗芯片故障或更多位损坏需要更强的编码、交织或设备级保护。

更长与缩短形式

完整二进制汉明码的长度是 2^r - 1,常见为 7、15、31、63。系统也可以固定并省略某些数据位置,形成缩短码。它携带更少数据,但继承原有校验关系。

真实协议必须明确位置编号、线路顺序、字节打包、奇偶约定,以及是否包含总校验位。两个实现都称自己使用汉明码,却可能以相反方向显示码字;只有完整格式一致才能互操作。

典型应用

  • **ECC 内存:**扩展形式纠正孤立的存储单元错误并报告双错。
  • **数字通信:**简单链路可以在不重传的情况下修复偶发单比特问题。
  • **存储与嵌入式系统:**用较少逻辑为短数据字段提供清晰保护。
  • **教学与硬件设计:**直观展示多个冗余方程如何共同定位故障。
  • **现代纠错的基础概念:**更强的块码采用更复杂数学,但最小距离和伴随式解码思想仍然相关。

当信道主要产生互相独立的单比特错误、实现成本又需要保持较低时,这种方案很有吸引力。若实际错误常成簇出现,就应根据统计特征选择更强保护。

常见错误

  • **位置从 0 开始:**标准推导从 1 编号,校验位才能落在二的幂位置。
  • **把数据放进校验位:**1、2、4、8 等位置必须预留。
  • **编码和解码使用不同奇偶约定:**两种规则都可行,但双方必须一致。
  • **把伴随式顺序读反:**P1 是最低有效位,P4-P2-P1 才组成数值位置。
  • **认为基本形式能安全识别所有双错:**需要额外总校验位才能获得 SECDED。
  • **直接访问超出码长的伴随式:**应报告格式或多错故障,不能盲目索引。
  • **未约定数据顺序:**要明确第一个输入数据位放入最低还是最高可用位置。

常见问题

汉明码最简单的解释是什么?

它给数据增加若干互相重叠的奇偶校验。失败校验的组合会形成一个错误地址,因此接收端可以把对应比特翻转回来。

为什么校验位位于二的幂?

这些位置的二进制地址只有一个 1。其他位置则有独特的 1 组合,因此参与哪些校验组就能唯一标识其编号。

Hamming(7,4) 中两个数字表示什么?

它表示总长七位、其中四位为数据,另外三位为校验。基本形式可以纠正这个码字中的一个比特错误。

能否纠正两个错误?

不能。标准形式纠正一个错误;增加总校验位后可以检测两个错误,但仍不能同时修复它们。多错纠正需要更强编码。

什么是伴随式?

伴随式是全部校验结果组合成的二进制数。零表示基本校验全部通过;非零时,在单错模型下,它就是错误位置编号。

汉明距离与汉明码是一回事吗?

不是。汉明距离是衡量两个等长字符串差异数量的通用指标,汉明码则是利用这种距离构造的一类具体纠错编码。

汉明码能保护数据机密吗?

不能。它的冗余公开用于可靠性,而不是保密。知道布局的人都能提取数据,机密性必须由加密提供。

总结

汉明码把校验位安排在二的幂位置,让不同校验组覆盖不同的二进制地址。失败结果组成伴随式,可以定位一个翻转位。Hamming(7,4) 把四位数据编码为七位;增加总校验位后获得 SECDED。使用时必须尊重能力边界:基本形式只保证单错纠正,扩展形式才能可靠检测双错,而突发或多位故障需要更强保护。

管理员

管理员