各种校验码超详细讲解

一、奇偶校验码(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 Na+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…)

位置1234567891011
类型P1P2D1P3D2D3D4P4D5D6D7

假设数据: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 D70 0 1 1 0 1 1


4️⃣ 错误定位

接收方重新计算各校验位,若结果不一致则标记为1:

假设第5位出错(D2=0变成1)

校验位实际值接收方计算值差异
P1101
P2110
P3011
P4000

错误位置 = 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-1611000000000000101数据链路层(PPP协议)
CRC-32100000100110000010001110110110111以太网、ZIP文件
CRC-CCITT10001000000100001X.25协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值