一、奇偶校验码(Parity Check)
核心思想
在数据末尾加1位比特,让整个数据中1的总个数是奇数或偶数
🧮 计算方法(以ASCII字符为例)
1. 偶校验(Even Parity)
目标:总1的个数为偶数
步骤 | 操作 |
---|---|
1 | 统计原始数据中1的个数 |
2 | 如果是偶数 → 补0;如果是奇数 → 补1 |
例子:传输字符 ‘E’(ASCII码 01000101)
- 数据中有 2 个1 → 是偶数
- 校验位 = 0
- 最终发送:
01000101 0
2. 奇校验(Odd Parity)
目标:总1的个数为奇数
步骤 | 操作 |
---|---|
1 | 统计原始数据中1的个数 |
2 | 如果是奇数 → 补0;如果是偶数 → 补1 |
例子:传输字符 ‘A’(ASCII码 01000001)
- 数据中有 2 个1 → 是偶数
- 校验位 = 1
- 最终发送:
01000001 1
🚨 校验过程
接收方收到数据后:
收到数据:11010110 1
统计总共有:1+1+0+1+0+1+1+0 = 5个1 + 校验位1 → 总共6个1(偶数)
→ 符合偶校验 → 认为无错误
⚠️ 局限性
- 只能发现奇数个错误(只有当翻转(0变1,1变0)的比特数为奇数时,奇偶性才会变化,从而被检测到)
- 无法定位错误位置
- 无法检测偶数个错误
为什么奇偶校验码只能检测奇数个错误?
(一)、核心原理
奇偶校验码的本质是通过统计1的总数来判断是否发生错误。当传输过程中出现奇数个比特翻转时,1的总数的奇偶性会改变,从而被检测到;而偶数个比特翻转时,1的总数的奇偶性可能保持不变,导致错误未被发现。
(二)、数学推导
1. 假设场景
- 原始数据:有 N N N 个1( N N N 为整数)
- 校验方式:偶校验(原理相同,奇校验同理)
错误类型 | 翻转位数 | 1的总数变化 | 奇偶性变化 | 是否能检测 |
---|---|---|---|---|
无错误 | 0 | N N N | 不变 | ❌(无错误) |
单比特错误 | 1 | N ± 1 N \pm 1 N±1 | 改变 | ✅ |
双比特错误 | 2 | N ± 2 N \pm 2 N±2 | 不变 | ❌ |
三比特错误 | 3 | N ± 3 N \pm 3 N±3 | 改变 | ✅ |
2. 关键公式
设原始1的个数为 N N N,错误导致翻转的1→0数量为 a a a,翻转的0→1数量为 b b b,则:
- 新1的总数 = N − a + b N - a + b N−a+b
- 奇偶性变化条件: a + b a + b a+b 为奇数(因为奇偶性只与总数的奇偶性有关)
结论:只有当翻转的比特数( a + b a + b a+b)为奇数时,奇偶性才会变化,从而被检测到。
(三)、举例说明
场景1:单比特错误(奇数个错误)
- 原始数据:
1011
(3个1) - 偶校验位:1(总1的个数为4,偶数)
- 传输后第2位错误:
1001
- 接收方检测:总1的个数为3(奇数)→ 检测到错误 ✅
场景2:双比特错误(偶数个错误)
- 原始数据:
1011
(3个1) - 偶校验位:1(总1的个数为4)
- 传输后第1位和第3位错误:
0001
- 接收方检测:总1的个数为1(奇数)→ 检测到错误 ✅
场景3:双比特错误(偶数个错误但未改变奇偶性)
- 原始数据:
1011
(3个1) - 偶校验位:1(总1的个数为4)
- 传输后第1位(1→0)和第4位(0→1)错误:
0011
- 接收方检测:总1的个数仍为3(奇数)→ 未检测到错误 ❌
(四)、为什么不能检测偶数个错误?
1. 数学解释
当翻转的比特数为偶数时:
- 若同时翻转的1→0和0→1数量相等(如1个1→0和1个0→1),则总1的个数不变。
- 若翻转的1→0比0→1多2个(如2个1→0,0个0→1),总1的个数减少2,奇偶性不变。
2. 直观类比
想象一个天平:
- 奇偶校验就像判断左右两边重量的奇偶性。
- 如果你偷偷在两边各加/减相同重量(偶数个错误),天平看起来还是平衡的(检测不到错误)。
- 如果你在一边加/减奇数个重量(奇数个错误),天平就会倾斜(检测到错误)。
(五)、总结
错误类型 | 奇偶性变化 | 是否能检测 | 举例 |
---|---|---|---|
奇数个错误 | ✅ 改变 | ✅ 能检测 | 1位、3位、5位错误 |
偶数个错误 | ❌ 可能不变 | ❌ 无法检测 | 2位、4位错误(部分情况) |
关键点:奇偶校验码只能检测破坏1的总数奇偶性的错误,而偶数个错误可能恰好抵消奇偶性变化,导致漏检。
二、海明码(Hamming Code)
核心思想
通过插入多个校验位,不仅能发现还能定位并纠正单比特错误
🧵 完整计算流程(以7位数据为例)
1️⃣ 确定校验位数量
使用公式:2r ≥ n + r + 1
(n=数据位数,r=校验位数)
例子:n=7
尝试 r=3 → 2³=8 < 7+3+1=11 ❌
尝试 r=4 → 2⁴=16 ≥ 7+4+1=12 ✅
→ 需要 4个校验位
2️⃣ 插入校验位
校验位放在位置为2的幂的位置(1,2,4,8…)
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
类型 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 | D7 |
假设数据:1011011
(D1~D7)
3️⃣ 计算每个校验位
每个校验位负责一组特定位置(看位置编号的二进制):
校验位 | 负责的位置(二进制说明) | 实际位置 |
---|---|---|
P1 | 所有第1位为1的位置 | 1,3,5,7,9,11 |
P2 | 所有第2位为1的位置 | 2,3,6,7,10,11 |
P3 | 所有第3位为1的位置 | 4,5,6,7 |
P4 | 所有第4位为1的位置 | 8,9,10,11 |
计算规则:对每组数据位做偶校验
手动计算:
原始数据:D1=1, D2=0, D3=1, D4=1, D5=0, D6=1, D7=1
P1组:3(1),5(0),7(1),9(0),11(1) → 有3个1 → 需补1 → P1=1
P2组:3(1),6(1),7(1),10(1),11(1) → 有5个1 → 需补1 → P2=1
P3组:5(0),6(1),7(1) → 有2个1 → 需补0 → P3=0
P4组:9(0),10(1),11(1) → 有2个1 → 需补0 → P4=0
最终编码:P4 P3 P2 P1 D5 D6 D7
→ 0 0 1 1 0 1 1
4️⃣ 错误定位
接收方重新计算各校验位,若结果不一致则标记为1:
假设第5位出错(D2=0变成1)
校验位 | 实际值 | 接收方计算值 | 差异 |
---|---|---|---|
P1 | 1 | 0 | 1 |
P2 | 1 | 1 | 0 |
P3 | 0 | 1 | 1 |
P4 | 0 | 0 | 0 |
错误位置 = P4’ P3’ P2’ P1’ = 0 1 0 1 = 5 → 第5位错误!
三、循环冗余码(CRC)
核心思想
用多项式除法生成冗余码,检测数据传输中的突发错误
🧮 完整计算流程(以CRC-4为例)
1️⃣ 选择生成多项式
CRC-4:G(x) = x^5 + x^2 + x + 1 → 二进制 100111
(6位)
2️⃣ 发送端计算
步骤1:数据后加k个0(k=多项式次数)
原始数据:101111001010
添加4个0 → 1011110010100000
步骤2:模2除法(二进制除法,不借位)
用数据除以生成多项式:
步骤3:余数作为校验码追加
余数 = 00000
→ 发送完整数据:1011110010100000
3️⃣ 接收端验证
对接收到的数据用相同多项式做模2除法:
- 余数全0 → 无错误 ✅
- 余数非0 → 出现错误 ❌
四、对比总结表
类型 | 校验能力 | 纠错能力 | 传输效率 | 典型应用场景 |
---|---|---|---|---|
奇偶校验 | 单比特错误 | 无 | 高 | 内存校验、ASCII字符传输 |
海明码 | 单比特错误 | 单比特纠错 | 中 | 航天通信、内存ECC |
CRC | 多比特/突发错误 | 无 | 低 | 网络传输(WiFi/以太网) |
五、记忆口诀
奇偶校验像开关,1多补0少补1;
海明校验插空位,2的幂位放校验;
CRC就像长除法,模2运算不用借;
数据传输要可靠,校验码来把关牢!
六、常见标准CRC多项式
标准 | 生成多项式(二进制) | 应用场景 |
---|---|---|
CRC-16 | 11000000000000101 | 数据链路层(PPP协议) |
CRC-32 | 100000100110000010001110110110111 | 以太网、ZIP文件 |
CRC-CCITT | 10001000000100001 | X.25协议 |