ECC校验——汉明码(Hamming Code)

本文参考板块与链接:
https://en.wikipedia.org/wiki/Hamming_code #wiki英文版
https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E7%A0%81 #wiki中文版

前言

  本文主旨意在讲清如何根据原理构造常用的汉明码,鉴于本人在网络查阅资料过程翻阅大量低效/无效文章,特记录如下内容。前篇主要表明如何简单直接的构造汉明码,后续在了解汉明码具体校验原理的情况下,将会补录有关原理的内容。

1. 概念性解释

  Error Correcting Code (ECC)校验码。

  汉明码(Hamming Code)通用常用于各类Memory中纠正/检测single bit,检测double bits错误。根据结果类型可分为:

  • DED (Double Error Dection):可检测双bit错误
  • SECDED (Single Error Correct Double Error Dection):可检测单bit错误(并纠正),检测双bits错误(不可纠正)

  需要特别注意的是,以上两种类型的汉明码只能针对1 bit,2 bit进行检测或者纠正1 bit错误,如果数据位错误bit数不止两个,最终可能无法检测出错误。只不过一个检测数据中同时出现多bit数据错误发生的概率特别小,所以这种汉明码检测方式仍然是主流。

2. 汉明码构造方式

  汉明码构造可以分为两块:

  • 校验码(Parity Bit)
  • 数据位(Data Bit)

  汉明码实际是由校验码与数据位穿插而成,校验码穿插形式如下图所示(举例32bit长度数据):
ECC校验——汉明码(Hamming Code)
  可以直接看出(暂时忽略第39bit),P1, P2, P4, …等校验位依次代表0b1, 0b10, 0b100, …等特殊二进制数换算得到的位置。而数据位则根据长度依次填入序号3, 5, 7, …等位置。
 数据位D0~D31依次表明32-bit数据的每一位,校验位P1, P2, P4, …等则由已填充的数据位计算获取,直观视图如下:
ECC校验——汉明码(Hamming Code)
  根据这张表提供的规律,可以直接构造任意数据长度的汉明码。其中:

P1 = D[0] ^ D[1] ^ D[3] ^ … ^ D[30]
P2 = D[0] ^ D[2] ^ D[3] ^ … ^ D[31]
P4 = D[1] ^ D[2] ^ D[3] ^ … ^ D[31]
P8 = D[4] ^ D[5] ^ D[6] ^ … ^ D[25]
P16 = D[11] ^ D[12] ^ D[13] ^ … ^ D[25]
P32 = D[26] ^ D[27] ^ D[28] ^ … ^ D[31]

  不考虑PP7位的情况下,这种方式构造得到的汉明码一般称为7,4汉明码(存疑),只能纠正/检查1 bit错误。如果需要检测2 bit错误,可以增加1 bit校验位PP7,该校验位是前述所有数据位与计算所得校验位异或的结果,这种构造方式得到的汉明码一般称为8,4汉明码(同存疑)。同时可以从原理上看出汉明码构造的规律——某种意义上的二分法1

2.1 单bit检测/纠正构造举例

  原始数据:10101,按上表拆分后可以有,

P1 | P2 | 1 | P4 | 0 | 1 | 0 | P8 | 1

P1 = 1 ^ 0 ^ 0 ^ 1 = 0
P2 = 1 ^ 1 ^ 0 = 0
P4 = 0 ^ 1 ^ 0 = 1
P8 = 1 = 1

  所以构造得到的汉明码为 0b001101011

3. 汉明码纠错

  当接收端获取发送端传来的汉明码后,利用检验位与构造时对应数据位再次异或得到的结果,检测当前获取数据是否出现bit错误,并根据情况进行纠正。且当获取的新校验值为全0,则数据未发生错误,或发生多bit错误。

3.1 单bit检测/纠正举例

  假设接收到的汉明码为0b001100011,此时接收方并不知道该数据是否正确,所以进行汉明码的校验操作:

P1 | P2 | D0 | P4 | D1 | D2 | D3 | P8 | D4
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1

P1_check = P1 ^ 1 ^ 0 ^ 0 ^ 1 = 0
P2_check = P2 ^ 1 ^ 0 ^ 0 = 1
P4_check = P4 ^ 0 ^ 1 ^ 0 = 1
P8_check = P8 ^ 1 = 0

  P8P4P2P1 = 0b0110 = 6,所以是第6 bit数据位发生错误,如果需要纠正该bit,翻转即可获得正确数据:0b0011010111

4. 汉明码纠错原理

  待补充

5. 补充说明

5.1 单bit错误纠正

  可能有人会问,为什么针对单bit错误的检测总是要强调纠错这个事,理论上来说发现错误并纠正这是很正常的流程。但是,在这里需要考虑,不是所有场景都需要做纠错这个操作。很多场景,仅仅需要向上传递出现错误的信号,可能系统从某些角度而言,会重新获取该数据并发送,极端情况下可能会重启操作。所以,是否纠正检测的单bit错误,应该是由系统设计的场景决定。


  1. 以P16为分界线判断出错数据位在其左侧还是右侧,P8, P4, P2, P1同理。最后根据P16P8P4P2P1二进制码确定错误bit。 ↩︎

上一篇:ECC 相关知识


下一篇:苹果的组件保护机制 AuthCP