校验码
一、为什么需要校验码
计算机数据传输与存储过程中,可能出现:
- 噪声干扰
- 硬件故障
- 信号衰减
导致比特错误
检错(发现错误)
纠错(自动修正错误)
二、码距
⭐ 1. 码距定义
两个合法码字之间对应位不同的个数
例如
10101
11100
不同位 = 3 → 码距 = 3
⭐ 2. 最小码距 d
所有合法码字之间最小的距离
三、码距与检错/纠错能力关系
⭐ 1. 检错能力
若要检查e位错误 :
d ≥ e + 1
⭐ 2. 纠错能力
若要纠正 t 位错误 :
d ≥ 2t + 1
⭐ 3. 同时检错 + 纠错
- 纠正 t 位错
- 检查 e 位错
d ≥ e + t + 1
四、奇偶校验码
⭐ 原理
利用奇偶性
保证码字中:1 的个数为奇数(奇校验),或偶数(偶校验)
⭐ 特点
✅ 检测 1 位错误
❌ 无法纠错
❌ 无法检测偶数位错误
⭐ 码距
d=2
五、海明码(Hamming Code)
⭐ 1. 基本思想
利用多个奇偶效验位,通过定位错误位置来纠错
⭐ 2. 海明码的能力
- 纠正 1 位错误
- 检测 2 位错误
⭐ 3. 海明码最小码距
海明码最小码距 d = 3
⭐ 4. 校验位数量公式
设:
- 数据位 = n
- 校验位 = k
必须满足:2k≥n+k+12^k ≥ n + k + 12k≥n+k+1
⭐ 5. 海明码校验位位置
校验位放在:2^i 位
⭐ 6. 海明码编码步骤
步骤:
① 确定校验位数量
② 插入校验位位置
③ 按奇偶规则计算校验位
④ 得到最终码字
📝 例题
题目:假设信息码(数据位)为 1011,采用偶校验(即每个校验组中"1"的个数为偶数),求其海明码。
🚀 详细解题步骤
① 确定校验位数量 (k)
- 已知:信息位 n = 4
- 公式:2k≥n+k+12^k ≥ n+k+12k≥n+k+1
- 试算:
- 若 k=1:21=2,4+1+1=62^1=2,4+1+1=621=2,4+1+1=6(不满足)
- 若 k=2:22=4,4+2+1=72^2=4,4+2+1=722=4,4+2+1=7(不满足)
- 若 k=3:23=8,4+3+1=82^3=8,4+3+1=823=8,4+3+1=8(满足 8≥8)
- 结论:需要 3 个校验位(P1,P2,P3)
- 总位数:4+3=7位
② 插入校验位位置
- 规则:校验位Pi放在第 2i−12^{i-1}2i−1 的位置上(即第 1,2,4,8···位)。其余位置按顺序填入信息位
- 位置分配表:
| 位置序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 类型 | 信息位 | 信息位 | 信息位 | 校验位 | 信息位 | 校验位 | 校验位 |
| 符号 | D4D_4D4 | D3D_3D3 | D2D_2D2 | P3P_3P3 | D1D_1D1 | P2P_2P2 | P1P_1P1 |
| 数值 | 1 | 0 | 1 | ? | 1 | ? | ? |
③ 按奇偶规则计算校验位
- 规则核心:
- P1P_1P1(位置1)复杂校验二进制末位是1的位置:1,3,5,7
- P2P_2P2(位置2)复杂校验二进制倒数第二位是 1 的位置:2,3,6,7
- P3P_3P3(位置4)复杂校验二进制倒数第三位是 1 的位置:4,5,6,7
- (口诀:看位置序号的二进制表示,哪一位是1,就归哪个校验位管)
- 开始计算(采用偶校验,即组内"1"的总数为偶数):
- 计算P1P_1P1(检查位置 1, 3, 5, 7):
- 涉及数据:P1P_1P1,D1(1)D_1(1)D1(1),D2(1)D_2(1)D2(1),D4(1)D_4(1)D4(1)
- 现在 1 的数量为 3 个(奇数)
- 则P1P_1P1为1
- 计算P2P_2P2(检查位置 2, 3, 6, 7):
- 涉及数据:P2P_2P2,D1(1)D_1(1)D1(1),D3(0)D_3(0)D3(0),D4(1)D_4(1)D4(1)
- 现在 1 的数量为 2 个(偶数)
- 则P2P_2P2为0
- 计算P3P_3P3(检查位置 4, 5, 6, 7):
- 涉及数据:P3P_3P3,D2(1)D_2(1)D2(1),D3(0)D_3(0)D3(0),D4(1)D_4(1)D4(1)
- 现在 1 的数量为 2 个(偶数)
- 则P3P_3P3为0
- 计算P1P_1P1(检查位置 1, 3, 5, 7):
- 计算结果:P1=1,P2=0,P3=0P_1=1,P_2=0,P_3=0P1=1,P2=0,P3=0
④ 得到最终码字
| 位置序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 数值 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
最终海明码为:1010101
⭐ 7. 海明码纠错原理
计算校验结果 → 得到一个二进制数 → 错误位位置
直接翻转即可纠错
六、循环冗余校验码(CRC)
⭐ 1. 基本思想
利用模2除法生成校验码
⭐ 2. CRC工作过程
发送端
步骤:
1️⃣ 在数据后补0
2️⃣ 用生成多项式进行模2除法
3️⃣ 得到余数作为校验码
接收端
将收到的数据再次做模2除法:
- 余数 = 0 :无错
- 余数 ≠ 0 → 有错
📝 例题
- 原始数据 (M):
101110 - 生成多项式 (G):x3+x+1x^3+x+1x3+x+1
- 对应二进制除数:
1011(因为1∗x3+0∗x2+1∗x1+1∗x01*x^3+0*x^2+1*x^1+1*x^01∗x3+0∗x2+1∗x1+1∗x0)
- 对应二进制除数:
- 目标:求发送的完整帧(数据+校验码),并演示接收端验错。
🚀 第一部分:发送端计算
1️⃣ 在数据后补 0
- 规则:补 0 的个数 = 生成多项式的最高次幂(或者说是除数位数 - 1)
- 本题中,除数
1011是 4 位,所以补 3 个 0 - 被除数:
101110+000=101110000
2️⃣ 模 2 除法
- 加法/减法都等同于 异或 (XOR) 运算
- 1⊕1=0,0⊕0=0,1⊕0=1,0⊕1=11⊕1=0,0⊕0=0,1⊕0=1,0⊕1=11⊕1=0,0⊕0=0,1⊕0=1,0⊕1=1
- 不借位,不进位
- 每次商只取 1 或 0(够除商1,不够除商0)
竖式计算过程:
1 0 1 1 1 0 0 0 0
按位 ⊕ 1 0 1 1
-----------------------------------
0 0 0 0 1 0 0 0 0
1 0 1 1
------------------------------------
0 0 1 1 0
余数为110
3️⃣ 得到最终码字
- 原数据:101110
- 校验码:110
- 发送帧:101110110
🔍 第二部分:接收端验错
再次做模 2 除法
被除数:101110110
除数:1011
1 0 1 1 1 0 1 1 0
1 0 1 1
------------------------
0 0 0 0 1 0 1 1 0
1 0 1 1
0 0 0 0 0
------------------------
余数 = 0 → 判定:无错,接收数据有效
⭐ 3. CRC特点
优点:
- 检错能力极强
- 可检测突发错误
- 硬件实现简单
缺点:不能自动纠错
⭐ 4. CRC码距
一般 d ≥ 4
可检测:单错、双错、多位突发错
七、三种校验码对比
| 校验码 | 检错 | 纠错 | 码距 |
|---|---|---|---|
| 奇偶校验 | 1位 | 无 | 2 |
| 海明码 | 2位 | 1位 | 3 |
| CRC | 多位 | 无 | ≥4 |
八、总结
⭐ 码距关系
检错:d ≥ e + 1
纠错:d ≥ 2t + 1
同时:d ≥ e + t + 1
⭐ 海明码
2^k ≥ n + k + 1
d = 3
⭐ CRC
模2除法求余
奇偶检1不能纠
海明纠1检2错
CRC突发检错强
码距决定纠检数