数据校验码是为了在数据传输或存储中 检测或纠正错误 而设计的编码技术。其核心在于通过冗余信息(校验位)扩大码距,从而增强数据可靠性。
- 码距(Hamming Distance):两个合法码字间不同的二进制位数最小值。
- 码距=1:无法检错(任何单比特错误均转化为另一合法码字)。
- 码距≥2:可检测错误;码距≥3:可纠正单比特错误。
2.6.1奇偶校验码
奇偶校验码是一种最简单的冗余校验方法,用于检测数据在传输或存储过程中发生的奇数位错误(如1位、3位等)。其核心思想是通过添加1位校验位,使数据位与校验位中“1”的个数始终为奇数(奇校验)或偶数(偶校验)。
一、基本概念
-
码距(Hamming Distance)
码距是衡量数据冗余能力的关键参数,指两个合法码字之间不同的二进制位数最小值。- 码距=1:无法检错(任何单比特错误会变成另一个合法码字)。
- 码距≥2:可检测错误。
-
奇偶校验分类
- 奇校验:数据位 + 校验位中“1”的个数为奇数。
- 偶校验:数据位 + 校验位中“1”的个数为偶数。
二、工作原理
1. 编码流程(发送端)
假设要传输8位有效信息 D₇D₆D₅D₄D₃D₂D₁D₀
:
- 奇校验位公式:
P = !(D₇⊕D₆⊕D₅⊕D₄⊕D₃⊕D₂⊕D₁⊕D₀)
- 偶校验位公式:
P = D₇⊕D₆⊕D₅⊕D₄⊕D₃⊕D₂⊕D₁⊕D₀
示例:
有效信息 01010100
(8位):
- 奇校验码:
0 01010100
(校验位为0,保证总共有3个“1”) - 偶校验码:
1 01010100
(校验位为1,保证总共有4个“1”)
2. 校验流程(接收端)
接收端对所有位(含校验位)异或运算进行判断:
三、逻辑电路实现
用异或门塔式结构生成校验位:
公式推导:
- 偶形成:
P = D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0
- 奇形成:
P = ¬(D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0)
四、交叉奇偶校验
为提升检错能力,横向和纵向双维度校验:
数据块实例(每行/每列均为偶校验):
D7 D6 D5 D4 D3 D2 D1 D0 → P行
Row1: 1 0 1 0 0 0 0 1 → 0
Row2: 0 **1** 1 0 0 1 0 → 1 (红字表示出错位置)
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
P列: 1 1 0 0 0 1 0 1
- 优点:可检测多比特错误(如两位同一行列错误);
- 缺点:冗余计算复杂度较高。
五、典型应用场景
- 1.内存读/写:如检查RAM芯片数据是否损坏。
- 2.ASCII字符传输:在7位ASCII码后附加1位校验位。
- 3.低要求短程通信:如早期串口通信。
六、优缺点对比
优点 | 缺点 |
---|---|
实现简单(仅需1位校验) | 只能检测奇数位错误 |
计算速度快(异或逻辑) | 无法定位错误位置 |
低资源消耗 | 无法纠正错误 |
总结
- 适用场景:要求低开销、低复杂度的简单检错场景(如内存数据校验)。
- 替代方案:需纠错时用汉明码,抗高频噪声用CRC。
2.6.2汉明校验码
汉明校验码是一种多重奇偶校验码,由理查德·汉明(Richard Hamming)提出,能自动纠正单比特错误并检测双比特错误。其核心思想是通过添加校验位并分组覆盖不同数据位,使每个错误产生唯一的校验结果(指误字),从而实现快速纠错。
一、设计原理
-
校验位与数据位的关系
设信息位数为 N N N,校验位数 K K K需满足:- 单纠错模式(纠正1位错误): 2 K ≥ N + K + 1 2^K \geq N + K + 1 2K≥N+K+1
- **单纠错 2 K − 1 ≥ N + K + 1 2^{K-1} \geq N + K + 1 2K−1≥N+K+1
例如,8位信息需4个校验位( 2 4 = 16 ≥ 8 + 4 + 1 = 13 2^4 = 16 \geq 8+4+1=13 24=16≥8+4+1=13)。
-
校验位位置
校验位必须位于汉明码位号的 2 i 2^i 2i位置(如 H 1 , H 2 , H 4 , H 8 H_1, H_2, H_4, H_8 H1,H2,H4,H8),其余位置为信息位。
示例:8位信息位的校验位分布汉明码位号:H13 H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1 对应内容: P5 D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
-
校验组分配规则
每个校验位负责二进制位号中某一位为1的所有比特:- P1( H 1 H_1 H1):覆盖位号二进制末位为1的位(如 H 1 , H 3 , H 5 , . . . H1, H3, H5, ... H1,H3,H5,...)
- P2( H 2 H2 H2):覆盖二进制倒数第二位为1的位(如 H 2 , H 3 , H 6 , . . . H2, H3, H6, ... H2,H3,H6,...)
- 以此类推,每个校验位通过逻辑异或(⊕)生成校验值。
二、编码过程实战
题目
以8位信息位 10110100
为例,生成汉明码(偶校验)。
步骤解析
1. 校验位位置分配
汉明码的校验位位于 2的幂次方位置(H1, H2, H4, H8),其余为信息位。总位数为 8(信息位) + 4(校验位) = 12位
,排列如下:
位号 | 1 (H1) | 2 (H2) | 3 | 4 (H4) | 5 | 6 | 7 | 8 (H8) | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
内容 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 | D7 | D8 |
2. 填入信息位
将原始信息位 10110100
按顺序填入非校验位(D1-D8):
位号 | 1 (P1) | 2 (P2) | 3 (D1=1) | 4 (P3) | 5 (D2=0) | 6 (D3=1) | 7 (D4=1) | 8 (P4) | 9 (D5=0) | 10 (D6=1) | 11 (D7=0) | 12 (D8=0) |
---|
3. 计算校验位值
使用 偶校验(即校验位使对应位置的1的个数为偶数):
-
P1(H1):覆盖位号
[1,3,5,7,9,11]
对应值:P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 ⊕ D7
计算:P1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 0 = 0
→ P1=0 -
P2(H2):覆盖位号
[2,3,6,7,10,11]
对应值:P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 ⊕ D7
计算:P2 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 = 0
→ P2=1 -
P3(H4):覆盖位号
[4,5,6,7,12]
对应值:P3 ⊕ D2 ⊕ D3 ⊕ D4 ⊕ D8
计算:P3 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0
→ P3=0 -
P4(H8):覆盖位号
[8,9,10,11,12]
对应值:P4 ⊕ D5 ⊕ D6 ⊕ D7 ⊕ D8
计算:P4 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 0 = 0
→ P4=0
4. 最终汉明码
将校验位填入对应位置:
位号 | 1 (H1) | 2 (H2) | 3 (D1=1) | 4 (H4) | 5 (D2=0) | 6 (D3=1) | 7 (D4=1) | 8 (H8) | 9 (D5=0) | 10 (D6=1) | 11 (D7=0) | 12 (D8=0) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
内容 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
最终汉明码为:
0 1 1 0 0 1 1 0 0 1 0 0
(按位号顺序排列)。
验证
- 总码距:汉明码的最小码距为3,可检测2位错误或纠正1位错误。
- 示例纠错:若传输中某位翻转(如H3变为0),通过重新计算校验位可定位并修正错误。
三、接收端纠错与检错
接收端通过重新计算校验组并生成**指误字(Syndrome)**定位错误:
-
指误字计算
每组偶校验重新计算:- S 1 = P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 ⊕ D 5 ⊕ D 7 S_1 = P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 ⊕ D7 S1=P1⊕D1⊕D2⊕D4⊕D5⊕D7
- S 2 = P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 ⊕ D 7 S_2 = P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 ⊕ D7 S2=P2⊕D1⊕D3⊕D4⊕D6⊕D7
- S 3 = P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 ⊕ D 8 S_3 = P3 ⊕ D2 ⊕ D3 ⊕ D4 ⊕ D8 S3=P3⊕D2⊕D3⊕D4⊕D8
- S 4 = P 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 ⊕ D 8 S_4 = P4 ⊕ D5 ⊕ D6 ⊕ D7 ⊕ D8 S4=P4⊕D5⊕D6⊕D7⊕D8
-
错误定位
将 S 4 S 3 S 2 S 1 S_4S_3S_2S_1 S4S3S2S1转换为十进制,即为错误位号:
-
纠错与检错能力
- 纠正1位错误:指误字唯一对应错误位号。
- 检测2位错误:指误字非0但无法对应单比特错误位置。
四、汉明码应用场景
场景 | 作用 |
---|---|
ECC内存 | 自动纠正单比特错误,防止系统崩溃 |
卫星通信芯片 | 纠正传输中的单点干扰错误 |
固态硬盘(SSD) | 数据存储容错,保障数据完整性 |
五、总结
汉明码通过巧妙的校验位分组覆盖机制,能精确定位并修复单比特错误,是实现高可靠计算的核心技术之一。理解其编码规则与检错逻辑是掌握计算机校验体系的重要基础。
2.6.3循环冗余校验码
循环冗余校验码(Cyclic Redundancy Check,CRC)是一种基于多项式运算的校验方法,用于检测数据传输或存储中的错误。其核心思想是通过生成多项式对数据进行编码,生成校验码,接收方通过相同的多项式验证数据的合法性。
一、基本原理
-
数学基础
数据被表示为多项式 M ( x ) M(x) M(x)。例如,数据1100
对应多项式 M ( x ) = x 3 + x 2 M(x) = x^3 + x^2 M(x)=x3+x2。
生成多项式 G ( x ) G(x) G(x) 是收发双方约定的一个高次多项式,例如 G ( x ) = x 3 + x + 1 G(x) = x^3 + x + 1 G(x)=x3+x+1(对应二进制1011
)。 -
校验位的生成
- 数据左移 k k k 位(生成多项式度数为 k k k),得到 M ( x ) ⋅ x k M(x) \cdot x^k M(x)⋅xk。
- 对 M ( x ) ⋅ x k M(x) \cdot x^k M(x)⋅xk 进行模2除法运算,除以 G ( x ) G(x) G(x),得到余数 R ( x ) R(x) R(x)。
- 将余数 R ( x ) R(x) R(x) 附加到原始数据后,形成完整的 CRC 码。
-
校验过程
接收方将收到的数据用相同多项式 G ( x ) G(x) G(x) 进行模2除法运算,余数为0表示无错误;余数非0则检测到错误。
二、编码过程
1. 示例:数据 1100
生成 CRC 码(生成多项式 1011
)
步骤说明:
-
数据 M = 1100 M = 1100 M=1100 → M ( x ) = x 3 + x 2 M(x) = x^3 + x^2 M(x)=x3+x2。
-
左移 k = 3 k = 3 k=3 位(生成多项式度数为3)得到
1100000
(对应 M ( x ) ⋅ x 3 M(x) \cdot x^3 M(x)⋅x3)。 -
模2除法运算:
1100000 (被除数) ÷ 1011 (除数) → 余数 R = 010
-
最终 CRC 码:
1100010
(数据左移3位后附加余数)。
模2除法流程:
三、检错与纠错
- 接收端检错
-
纠错能力(有限)
- CRC通常用于检错而非纠错。若需纠错,需结合其他机制(如重传)。
- 通过余数的唯一性可定位错误位(精确纠错需复杂算法支持)。
四、生成多项式要求
- 标准生成多项式举例:
名称 | 多项式表示 | 应用场景 |
---|---|---|
CRC-16 | x16+x15+x2+1x16+x15+x2+1 | 工业控制(Modbus) |
CRC-32 | x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 | ZIP, 以太网 |
-
生成多项式特性:
- 必须确保任何单比特错误都能产生唯一余数。
- 高次多项式可提升检错能力(如检测突发错误)。
五、关键特性与对比
特性 | 奇偶校验 | 汉明码 | CRC |
---|---|---|---|
检错能力 | 单比特/奇数位错误 | 单比特错误 + 双比特检测 | 长突发错误检测 |
纠错能力 | 无 | 单比特纠错 | 无(需扩展算法) |
冗余位比例 | 1位 | log 2 ( N ) \log_2(N) log2(N) 位 | 16/32位(依标准定) |
典型应用 | 内存单字节校验 | ECC内存 | 网络、磁盘存储 |
六、CRC在实践中的应用
- 网络传输:以太网帧尾附加4字节CRC校验字段(见
MAC帧结构
)。 - 存储设备:磁盘扇区校验,保障数据完整性。
- 通信协议:USB、SATA协议数据传输均依赖CRC检测错误。
七、总结
循环冗余校验码通过多项式模2运算高效检测数据传输错误,是大规模数据传输(如网络、存储)的核心检错技术。虽然其纠错能力有限,但检错可靠性极高,结合重传机制可构建稳健的通信系统。
总结
- 奇偶校验用于简单检测,代价低但能力有限。
- 汉明码适合需纠错的场景,如内存错误恢复。
- CRC适用于高吞吐量数据传输中的高可靠检测。