Skip to content

校验码总述:码距、奇偶校验与 CRC

2026 大纲的「二、数据的表示和运算」与「三、存储器层次结构」均已不含校验码,本篇不对应任何条目编号;但检错编码(奇偶校验、CRC)与纠错编码(海明码)在 408 计算机网络「三(三)差错控制」 中仍是纲内内容,原理完全通用。

怎么分配时间:备考 CN 差错控制的按纲内内容读;只复习 CO 的读一遍建立概念即可,不必做题训练

冗余买的是一块"非法位串"缓冲区

n 位串一共有 2n 种,如果全都合法,那么任何一位出错之后得到的仍是一个合法码字——接收端根本无从察觉。校验码的全部做法就是:只让其中 2k 种合法,其余全部非法。冗余位买来的正是这块"非法位串"缓冲区,它越厚,能识别的错误就越多。

衡量这块缓冲区厚度的量叫码距:两个等长码字对应位不同的个数10111101 的码距是 2);最小码距 d 是所有合法码字两两码距的最小值。

🔴 谈能力时说的永远是最小码距——整套编码的能力由最弱的那一对码字决定。

而全部能力只需要一个式子:

🔴 同时检 e 位、纠 t 位(et)需要 de+t+1。令 e=t 就退化成"纠 t 位"的 d2t+1;令 t=0 就退化成"只检 e 位"的 de+1另外两个式子不用背。

由它立刻能读出一条常被弄混的结论:

🔴 d=3 是"检 2 位"或"纠 1 位",不能兼得——兼得要求 d2+1+1=4。根源在于:检错只要求出错后的串落在球外,纠错却要求它落在正确那个球内,同一份距离预算一次只能满足一种解释。推论:纠错能力恒不大于检错能力。

一、冗余的本质:让合法码字变稀疏

n 位二进制串一共有 2n 种。如果这 2n全部合法,那么任何一位出错之后得到的仍是一个合法码字——从结果上根本看不出发生过错误

所以有 k 位信息要传时,我们不发 k 位,而是发 n=k+r 位。2k 个合法码字散布在 2n 个位串里,其余 2n2k 个位串一旦出现,接收端立刻知道传输出了错。冗余越多,合法码字越稀疏,缓冲区越厚。

二、码距决定的能力

最小码距 d能力
1无(任何一位错都变成另一个合法码字)
2检 1 位
3检 2 位 纠 1 位
4检 2 位 纠 1 位
2t+1t
e+t+1ete 位且纠 t
三个不等式各自是怎么推出来的:从"落进非法区"到"半径 t 的球互不相交"(想弄清为什么纠错要 2t+1 而不是 t+1 时展开)

检错 de+1 合法码字 C 发生 e 位错误后变成 C,两者码距恰好是 e。只要 C 不是另一个合法码字,接收端就能发现异常;而任意两个合法码字之间的距离至少是 d,所以只要

e<dde+1

错误就"走不到"另一个合法码字上,一定落进非法区。

纠错 d2t+1 纠错比检错多要求一件事:不仅要知道错了,还要知道原来是谁。 做法是"就近归属"——把收到的串归给离它最近的那个合法码字。要保证判断唯一,就要求以每个合法码字为球心、半径 t 的"球"互不相交

C 是发送的码字、R 是收到的串,d(C,R)t。对任意另一个合法码字 C2,由三角不等式 d(C,C2)d(C,R)+d(R,C2),若 d(C,C2)2t+1

d(R,C2)(2t+1)t=t+1>t

R 一定落在 C2 的球外,归属没有歧义

同时检纠 de+t+1 两个要求会互相干扰:错了 e 位得到的串 R,如果恰好掉进别的合法码字的半径 t 球里,接收端不但不报警,还会把它"纠"成那个错的码字——比不纠更糟。要杜绝的正是这一种情形,即 R 与任何其他合法码字 C2 的距离都必须大于 t。反设 d(R,C2)t,由三角不等式

d(C,C2)d(C,R)+d(R,C2)e+t

即只要存在一对合法码字距离 e+t,误纠就可能发生。把这段距离堵死,就得到 de+t+1

三、三类校验码在这个框架里的位置

编码最小码距能力冗余位数
奇偶校验2检出奇数位错,不能纠1 位
海明码(SEC)3纠 1 位 检 2 位r 位,2rk+r+1
海明码(SEC-DED)4纠 1 位 检 2 位上式再加 1 位
CRC取决于生成多项式检出所有长度 r 的突发错误r

三者的差别可以只用码距解释:码距越大能力越强,而码距是靠冗余位数换来的。奇偶校验只加 1 位,能力最弱;海明码加 log 级的位数换到 d=3;SEC-DED 再加 1 位换到 d=4。CRC 略有不同——它不是把能力做在"任意 e 位错"上,而是做在突发错误上。

四、奇偶校验:只买了一位冗余

在数据位之外加 1 位校验位,使整个码字里 1 的个数满足奇偶约定:偶校验是全部位异或结果为 0(1 的个数为偶数),奇校验是异或结果为 1。

最小码距 d=2:要从一个合法码字变到另一个合法码字,至少得改动 2 位——改 1 位数据位会破坏奇偶性,必须再改校验位补回来。代入 de+t+1e=1,t=0,即只能检 1 位、完全不能纠

🔴 奇偶校验只能检出奇数位错。偶数位时,1 的个数变化量是 0±2奇偶性不变,一律漏检

五、CRC:把码字看成多项式

k 位数据看成一个多项式的系数,用约定的生成多项式 G(x)r+1 位)做模 2 除法,余数(r 位)就是校验位。

发送端 数据左移 r 位(末尾补 r 个 0)÷G(x)余数即校验位,附在数据后接收端 整个码字÷G(x)余数为 0 则认为无错

为什么接收端除出来应该是 0:发送的码字 =(数据×2r)+余数,而模 2 运算下"减去余数"和"加上余数"是同一件事,所以这个码字恰好能被 G(x) 整除。任何使它不再整除的改动都会暴露。

模 2 除法逐步走一遍:求校验位、验证无错、再制造一位错看余数怎么变(想核对自己的竖式或验证"余数只由错误图样决定"时展开)

数据 110101,生成多项式 G(x)=x3+x+1(即 1011r=3)。

求校验位:数据末尾补 3 个 0 得 110101000,对 1011 做模 2 除法。每一步只看当前最高位:是 1 就把 1011 对齐异或一次,是 0 就直接跳过。

当前余式最高位动作结果
011010100011011 从第 0 位对齐异或011001000
10110010001(第 1 位)1011 从第 1 位对齐异或001111000
20011110001(第 2 位)1011 从第 2 位对齐异或000100000
30001000001(第 3 位)1011 从第 3 位对齐异或000001100
40000011000(第 4 位)跳过000001100
50000011001(第 5 位)1011 从第 5 位对齐异或000000111

低 3 位即余数 111,故发送码字 = 110101 + 111 = 110101111。(商是 111101,把每一步"做了/跳过"依次记下来就得到它。CRC 只要余数,商可以不算。)

接收端验证:把 110101111 整体除以 1011,余数为 000,判定无错。

出错的情形:设传输中第 3 位由 0 变成 1,接收到 111101111。再除以 1011,余数为 101 0,错误被检出。

这个余数可以不重算:第 3 位(共 9 位)出错对应错误图样 x6,反复用 x3x+1 降次得 x4x2+xx5x2+x+1x6x2+1= 101余数是错误的函数,与数据无关——这也解释了 CRC 为什么只需要余数。

考点速记

  1. 检错的前提是让合法码字稀疏n 位串共 2n 种,只让 2k 种合法,其余作为"错误可落入"的缓冲区;能力由最小码距一个数决定。
  2. 同时检 etde+t+1 是唯一要记的一式(令 e=td2t+1,令 t=0de+1);因此 d=3 是"检 2 或纠 1"不能兼得,纠错能力恒不大于检错能力。
  3. 奇偶校验 d=2 只能检奇数位错;CRC 用模 2 除法(异或代替减法),能检出所有长度 r突发错误不能定位(要定位得用海明码那种把位置编码进校验组的设计)。三者的差别可归结为:用多少冗余位换多大的码距,以及把能力做在随机错误还是突发错误上。

这一节在真题里的位置

校验码在 408 真题里出题极少——下方「真题练习」挂的 error-detection-correction 这个 topic 至今只有一道题(问海明码纠一位错所需的校验位数),而且它属于兄弟篇 海明码的构造与纠错本篇至今不单独成题,这不是漏挂标签。

复习优先级因此很清楚:de+t+1 和"奇偶校验只检奇数位错"两条记住即可,CRC 的模 2 除法会算一遍、知道它检突发错误且不能定位就够了,不必投入更多时间。真要练手,练海明码那篇。

易错:把 d=3 说成"既能检 2 位又能纠 1 位"。兼得要 d4

易错:认为奇偶校验能检出所有 1 位以上的错。偶数位错一律漏检。

易错:以为 CRC 能定位错误位。它只报"有错"。

教材出处
  • 编码最小距离的定义、L1=D+CDC(检错位数不小于纠错位数)、"L=3 时最多能检二位,或检一位纠一位":唐朔飞《计算机组成原理》第 3 版 第 4 章 存储器·汉明码,印刷页 p100

相关知识

海明码详解|计算机网络博客的差错控制

真题练习

相关真题(1题)