1.2.1 校验码概述
本节导学
校验码解决的是一个很朴素的问题:二进制数据在传输或存储时,某一位可能从 0 变成 1,也可能从 1 变成 0。如果接收方只看到一串合法的 0/1,它很难判断这串数据是不是已经被改坏。校验码的做法是在原始信息位之外加入冗余信息,让“合法码字”变少,让错误更容易暴露出来。
课程把本章的校验码分成三类:奇偶校验、CRC 循环冗余校验、海明校验码。软件设计师考试中,奇偶校验和 CRC 多考特点,海明码考得最频繁,通常会考校验位个数、位置规律和纠错思路。
校验码的核心:用冗余换可靠性
校验码不是为了表达更多业务信息,而是为了建立一条“接收方可以复核的规则”。发送方根据原始数据计算校验位,接收方用同一规则重新检查。如果规则不成立,就说明数据发生了错误。
| 名称 | 冗余位如何来 | 主要能力 | 软考定位 |
|---|---|---|---|
| 奇偶校验 | 通常增加 1 位,让 1 的个数满足奇/偶约束 | 可检出奇数位错误,不可纠错 | 掌握编码方式和局限 |
| CRC | 根据生成多项式做模 2 除法,余数作为校验位 | 检错能力强,可检多位错,通常不可纠错 | 记住“生成多项式、模 2 除法、余数” |
| 海明码 | 多个校验位分组交叉覆盖数据位 | 可检错,也可纠正典型单比特错误 | 高频,必须会公式和位置 |
冗余的代价是增加存储或传输位数,收益是更可靠。技术演进也沿着这条线推进:奇偶校验代价最低但能力弱;CRC 牺牲更多校验位换来更强检错;海明码进一步组织校验位,使校验结果能定位错误位置,从而具备纠错能力。
检错与纠错不是一回事
检错是发现“这串数据不对”;纠错是进一步知道“哪一位不对”,并把它改回来。对二进制而言,一旦定位到错误位,修正非常简单:0 取反为 1,1 取反为 0。真正困难的是定位。
用生活例子理解:如果日历告诉你 1 月 1 日是星期一,而一条消息写成“1 月 1 日星期二”,你能判断消息有问题;但如果消息里有很多字段,你还需要知道具体哪个字段错了,才谈得上自动修正。校验码也是这样:发现矛盾只是检错,定位矛盾来源才是纠错。
| 能力 | 含义 | 判断标准 | 代表 |
|---|---|---|---|
| 检错 | 能发现码字不满足约定规则 | 接收端校验失败 | 奇偶校验、CRC、海明码 |
| 纠错 | 能定位错误位并修正 | 校验结果能唯一指向错误位置 | 海明码 |
码字、码距与“为什么能校验”
码字是实际参与传输或存储的整体,通常由信息位和校验位组成。码距是两个码字对应位置不同的位数;一个编码体系的最小码距 d,是任意两个合法码字之间码距的最小值。
比如只用一位二进制表示性别,合法码字可能是 0 和 1,两者只差 1 位,最小码距为 1。此时接收方收到 1,无法判断它本来就是 1,还是从 0 翻转而来。
如果把合法码字改为 00 和 11,两个合法码字相差 2 位,最小码距变成 2。单比特翻转后会得到 01 或 10,它们不属于合法码字集合,错误就能被发现。这就是“通过增加冗余扩大码距”的直觉。
码距越大,合法码字之间隔得越远,错误越不容易“刚好变成另一个合法码字”。一般结论是:
考试中看到码距题,先找最小码距 d,再套公式。注意检错能力和纠错能力不是同一个数,纠错要求更高。
三种校验码为什么逐步升级
| 技术 | 优势 | 局限 | 为什么需要后续技术 |
|---|---|---|---|
| 奇偶校验 | 只加 1 位,计算极快,实现简单 | 偶数位错误可能漏检,无法定位错误位 | 数据链路或存储场景需要发现更复杂的多位错误 |
| CRC | 对多位错、突发错检出能力更强,硬件实现友好 | 通常只能报错,不能告诉错在哪里 | 需要自动修复时,仅检错不够 |
| 海明码 | 多组交叉校验可定位单比特错误,能纠错 | 冗余位更多,设计和编码更复杂 | 在内存 ECC 等场景,用额外成本换可用性 |
备考路线
- 先分清“检错”和“纠错”,不要把能发现错误等同于能修正错误。
- 奇偶校验重点记编码规则和局限:奇数位错可检,偶数位错可能漏检,不能纠错。
- CRC 重点记关键词:生成多项式、模 2 除法、余数、可检错不可纠错。
- 海明码重点记:
,校验位放在 1,2,4,8,...位置。
🧪 例题(按难度)
简单(3题)
中级(3题)
例题1(概念判断)
下列关于校验码的说法正确的是:
例题2(检错/纠错区分)
下列校验方式中,通常可用于纠错的是:
困难(1题)
📚 本课小结
- 校验码 = 信息位 + 冗余位
- 检错是“发现有错”,纠错是“定位并修正”
- 码距越大,能力越强(检错 d-1,纠错
)