☰
软考必考:校验码(奇偶校验、海明码、CRC循环冗余校验)最全详解
2026/9/25 22:42:10 网站建设 项目流程

目标:一文彻底掌握软考上午题中“校验码”所有考点。包含奇偶校验、海明码、CRC循环冗余校验的原理、计算过程、纠错方法、典型例题与解题技巧,看完这篇,无需再翻其他资料。


一、校验码基本概念

数据在传输或存储过程中可能因干扰产生错误,校验码通过在原始数据中附加冗余信息来检测或纠正错误。常见校验码包括:

  • 奇偶校验码:只能检测奇数个错误,不能纠错。
  • 海明码:可以检测并纠正一位错误。
  • 循环冗余校验码(CRC):可以检测多位错误,常用于数据通信和存储。

软考重点考查海明码的构建与纠错过程、CRC的编码与校验计算。


二、奇偶校验码

1. 原理

在原始数据后(或前)添加一位校验位,使得整个码字中“1”的个数为奇数(奇校验)或偶数(偶校验)。

  • 奇校验:添加校验位后,码字中“1”的总个数为奇数。
  • 偶校验:添加校验位后,码字中“1”的总个数为偶数。

2. 校验位计算

设原始数据为n位,校验位1位,共n+1位。

  • 若采用偶校验,校验位 = 原始数据中“1”的个数 mod 2 的补(即如果“1”的个数为奇数,校验位为1;如果为偶数,校验位为0)。
  • 若采用奇校验,校验位 = 原始数据中“1”的个数 mod 2 的结果(即如果“1”的个数为奇数,校验位为0;如果为偶数,校验位为1)。

例子:原始数据1011010(7位),求偶校验位。

  • 其中“1”的个数为4(偶数),所以偶校验位为0,码字为10110100。
  • 若奇校验,则校验位为1,码字为10110101。

3. 检错能力

  • 接收方重新计算校验位并与收到的校验位比较,若不同则说明传输有误。
  • 奇偶校验只能检测出奇数个位错误(1、3、5…),若发生偶数个位错误(2、4…),则“1”的个数奇偶性不变,无法检测。
  • 不能定位错误位置,因此不能纠错。

4. 软考常见题型

  • 给出数据,求奇/偶校验位。
  • 判断奇偶校验码能否检测出某类错误(如“能检测出1位错误,但不能检测出2位错误”)。

例题:若数据传输采用偶校验,下列接收到的码字中,哪个有误?
A. 10110100 B. 11001101 C. 01101011 D. 10011010
解析:分别统计每个码字中“1”的个数,若为偶数则正确,奇数则错误。
A:4个1(正确);B:5个1(错误);C:5个1(错误);D:4个1(正确)。因此B、C有误。但实际只能检测出有误,无法判定是哪一位出错。


三、海明码(Hamming Code)

1. 原理

海明码通过在数据位之间插入多个校验位,并将每个校验位与不同组合的数据位进行奇偶校验(通常采用偶校验),接收方通过重新计算校验位并比较,得到校验结果(称为“指误字”或“伴随式”),从而定位错误位,实现纠错。

2. 校验位位数与位置

设数据位为k位,校验位为r位,总码长n = k + r。要求满足:
2^r ≥ k + r + 1(或 2^r ≥ n + 1)
即校验位的组合状态数足以表示无错和每个位置出错的情况。

常见数据位与校验位对应:

数据位k校验位r总长n
123
2~435~7
5~1149~15
12~26517~31

校验位放在2的幂次位置上(1,2,4,8,…),其余位置按顺序放数据位。
例如数据位4位(k=4),需要r=3,总长7,位置如下:

位置1234567
用途P1P2D1P3D2D3D4

3. 校验位的计算

每个校验位负责校验一组位置,该组位置的特点是:其二进制编号中对应校验位位置编号的二进制位为1。(某个数据位由哪些校验位来管,就看它的位置编号的二进制表示里,哪几位是 1,对应的那几位校验位就来校验它。‌‌)

  • 校验位P1位于位置1(二进制001),负责校验二进制编号第1位(最低位)为1的所有位置:即1(001),3(011),5(101),7(111),…
  • P2位于位置2(二进制010),负责校验二进制编号第2位为1的所有位置:2(010),3(011),6(110),7(111),…
  • P3位于位置4(二进制100),负责校验二进制编号第3位为1的所有位置:4(100),5(101),6(110),7(111),…

计算每个校验位时,对它所负责的所有数据位进行偶校验(即使得包括校验位在内的该组中“1”的个数为偶数)。
公式:校验位 = 组内其他位(数据位)异或的结果(对于偶校验)。

例子:对数据1010(4位)生成海明码(偶校验)。

  • 数据位:D1=1, D2=0, D3=1, D4=0,放在位置3,5,6,7。
  • 计算P1:负责位置1,3,5,7。其中数据位有D1(位置3)=1, D2(位置5)=0, D4(位置7)=0。则P1 = 1⊕0⊕0 = 1(使得组内1的个数为2,偶数)。
  • 计算P2:负责位置2,3,6,7。数据位有D1(3)=1, D3(6)=1, D4(7)=0。P2 = 1⊕1⊕0 = 0(组内1个数为2)。
  • 计算P3:负责位置4,5,6,7。数据位有D2(5)=0, D3(6)=1, D4(7)=0。P3 = 0⊕1⊕0 = 1(组内1个数为2)。
  • 最终海明码(从位置1到7):P1 P2 D1 P3 D2 D3 D4 = 1 0 1 1 0 1 0,即1011010。

4. 检错与纠错过程

接收方收到海明码后,重新计算每个校验组(包括接收到的校验位)的偶校验结果,得到r位指误字S(S_r…S_1)。

  • 对于每个校验组,将组内所有位(包括校验位)异或,结果即为该组的校验结果(0表示正确,1表示有错)。
  • 例如第i个校验位对应的组,计算出S_i。
  • 将得到的r位结果按位置顺序排列(一般S_r S_{r-1}…S_1),该二进制数的十进制值即为出错位置编号(若为0表示无错)。
  • 将出错位取反即可纠正。

续上例:假设发送的海明码1011010在传输中第5位(D2)发生翻转变成1011110。

  • 接收方计算各校验组异或:
    • 组1(位置1,3,5,7):P1⊕D1⊕D2⊕D4 = 1⊕1⊕1⊕0 = 1 → S1=1
    • 组2(位置2,3,6,7):P2⊕D1⊕D3⊕D4 = 0⊕1⊕1⊕0 = 0 → S2=0
    • 组3(位置4,5,6,7):P3⊕D2⊕D3⊕D4 = 1⊕1⊕1⊕0 = 1 → S3=1
  • 指误字 = S3 S2 S1 = 101(二进制)= 5,表示第5位出错。
  • 将第5位取反即可恢复。

5. 软考常见题型

  • 构建海明码:给定数据位,求完整海明码(含校验位)。
  • 纠错:给出接收到的海明码(可能有一位错误),判断哪一位出错并纠正。
  • 理论问题:如海明码能纠正几位错误,校验位位数如何确定等。

例题:设数据为0110(4位),采用偶校验海明码,求完整编码及若接收为1110110时是否有错,错在哪位。
构建:

  • 数据位4,校验位3,总长7。位置:1(P1),2(P2),3(D1),4(P3),5(D2),6(D3),7(D4)。
  • 数据D1=0,D2=1,D3=1,D4=0(放入3,5,6,7)。
  • P1=位置3,5,7异或 = 0⊕1⊕0=1;
  • P2=位置3,6,7异或 = 0⊕1⊕0=1;
  • P3=位置5,6,7异或 = 1⊕1⊕0=0;
  • 完整码:P1 P2 D1 P3 D2 D3 D4 = 1 1 0 0 1 1 0 →1100110。
    检错:接收为1110110(第3位由0变1)。计算指误字:
  • S1 = P1⊕D1⊕D2⊕D4 = 位置1⊕位置3⊕位置5⊕位置7 = 1⊕1⊕1⊕0 = 1
  • S2 = P2⊕D1⊕D3⊕D4 = 位置2⊕位置3⊕位置6⊕位置7 = 1⊕1⊕1⊕0 = 1
  • S3 = P3⊕D2⊕D3⊕D4 = 位置4⊕位置5⊕位置6⊕位置7 = 0⊕1⊕1⊕0 = 0
  • 指误字 = S3S2S1 = 011(二进制)= 3,表示第3位出错。
  • 将第3位取反恢复为0,得到原码1100110。

四、CRC循环冗余校验(Cyclic Redundancy Check)

1. 原理

CRC是一种基于模2运算(异或)的校验码,通过在数据后面添加校验位(称为帧校验序列FCS),使得整个数据帧能够被一个预先约定的生成多项式G(x)整除(模2除法)。接收方用同样的G(x)去除,若余数为0则认为无错,否则有错。

2. 生成多项式

生成多项式是收发双方约定的一个二进制序列,通常用多项式表示,如:

  • CRC-12:G(x) = x^12 + x^11 + x^3 + x^2 + x + 1 (二进制:1100000001111)
  • CRC-16:G(x) = x^16 + x^15 + x^2 + 1 (二进制:11000000000000101)
  • CRC-CCITT:G(x) = x^16 + x^12 + x^5 + 1 (二进制:10001000000100001)
  • CRC-32:广泛用于以太网。

软考中常给出具体的生成多项式,如 G(x)=x3+x2+1,对应二进制1101(因为x^3, x^2, 1的系数为1,x^1系数为0)。

3. 编码过程(求CRC校验码)

设原始数据为k位,生成多项式G(x)的最高次为r,则校验位为r位。
步骤:

  1. 在原始数据后添加r个0,形成被除数(k+r位)。
  2. 用该被除数与生成多项式对应的二进制序列进行模2除法(异或),得到r位余数。
  3. 将余数替换步骤1中添加的r个0,得到最终发送的码字(k+r位)。

模2除法规则:

  • 按位异或,不借位。
  • 每一步:比较当前被除数的最高位与除数的最高位,若为1则商1,将除数与当前部分异或;若为0则商0(实际不操作),向右移一位。直到被除数位数小于除数位数,此时剩余部分为余数。

例子:数据101001(6位),生成多项式 G(x)=x3+x2+1(二进制1101,r=3),求CRC码。

  • 原始数据后加3个0:101001 000。
  • 模2除法计算余数:
    • 除数1101,被除数101001000
    • 详细步骤:
      101001000 1101 (第一位商1,异或) ------ 011101000 (前导0舍去,实际下一步用11101000) 1101 (商1,因为当前位为1) ------ 001001000 -> 1001000? 需要逐步展示
      我们使用更清晰的方法:
      初始被除数 A = 101001000,除数 B = 1101。
      第一次:A前4位1010 与B 1101,1010<1101,不够除,但模2除法看最高位为1就除?实际上规则是每次取和除数同样位数的部分,如果最高位为1则商1,异或;如果为0则商0,不异或直接移位。这里1010最高位为1,商1,异或1101得0111,然后补上后面的位继续。
      我们按标准步骤:
      • 被除数:101001000
      • 除数:1101
      • 第一步:取前4位1010,最高位1,商1,异或1101,结果0111,将下一位0移入得01110(即1110,省略前导0)。
      • 第二步:取前4位1110,最高位1,商1,异或1101,结果0011,移入下一位0得00110(即110)。
      • 第三步:取前4位0110(实际上只有3位了?此时被除数剩余位数不足4位,余数就是最后的3位)。
        实际上我们需要继续处理直到所有位处理完毕。
        更简单的方法:用长除法,最终余数为3位。
        我们计算得到余数:
        设原始数据加0后为101001000。
        逐次异或:
      1. 1010 xor 1101 = 0111 -> 剩余 0111000? 不,我们逐步。
        我们将被除数分为4位一组,当被除数位数不足时停止。
        使用模2除法:
      101001000 1101 ------ 11101000 (把0移下来,注意最左边是0,省略) 1101 ------ 0111000 (移下0) (现在前4位0111,最高位0,不除,直接移下一位,相当于商0) 111000 (0111 + 下一个0 = 1110, 最高位1) 1101 ------ 010100 (再移下0,变为01010,最高位0,继续移) 10100 (01010 + 0 = 1010, 最高位1) 1101 ------ 01100 (移下0,变为0110,最高位0) 1100 (移下0,1100最高位1) 1101 ------ 001 (余数3位)
      最终余数为001。
      因此校验位为001,发送码字为原始数据+校验位:101001 001。

4. 检错过程

接收方将收到的码字(k+r位)与生成多项式进行模2除法,若余数为0,则认为传输无误;若余数不为0,则有误。CRC可以检测多位错误,但不能纠错(除非知道错误模式)。

5. 软考常见题型

  • 给定数据和生成多项式,求CRC校验码(余数)或完整发送数据。
  • 判断接收码字是否有误(做除法看余数)。
  • 概念题:CRC能检测哪些错误(如突发错误长度小于等于r时全部可检测)等。

例题:设待发送数据为1101011011,采用CRC校验,生成多项式为10011(即G(x)=x^4+x+1),求CRC校验码。
解析:生成多项式10011,r=4,数据后加4个0,被除数1101011011 0000。
进行模2除法(略去详细步骤,可自行演算),余数为1110。所以CRC码为1101011011 1110。

接收方校验:用11010110111110除以10011,若余数为0则正确。


五、三种校验码对比

校验码类型检错能力纠错能力编码效率软考重点
奇偶校验检测奇数个错误无高简单计算,概念理解
海明码可检错并定位一位错误纠正一位错误较低构建与纠错过程
CRC检测多位错误(突发错误能力强)无较高编码与校验计算

六、易错点与注意事项

  1. 海明码校验位位置:校验位放在1,2,4,8等2的幂次位置,数据位依次填入其余位置。
  2. 海明码指误字:结果S_r…S_1的十进制值表示出错位置,若为0则无错。注意顺序不要颠倒。
  3. 奇偶校验:只能检出奇数个错,偶数个错漏检。
  4. CRC模2除法:余数位数等于生成多项式最高次数,不足时在前面补0。
  5. CRC发送码字:原始数据+余数(校验位),不是原始数据+原始数据后加0的结果。
  6. 生成多项式最高次与校验位位数:r等于G(x)的最高次数,如G(x)=x3+x2+1对应r=3,二进制1101。
  7. 海明码与CRC的选择:海明码多用于需要纠错的场合(如内存),CRC多用于网络通信检错。

七、总结与速记

  • 奇偶校验:加1位,奇数个错可检,不能纠错。
  • 海明码:校验位个数满足2^r ≥ k+r+1,校验位在2的幂次位,通过异或计算,指误字定位错误位。
  • CRC:数据后加r个0做模2除法,余数为校验位,接收方再除余数0则正确。

速记公式:

  • 海明码校验位位数:2^r ≥ n+1(n为总长)
  • CRC校验位位数 = 生成多项式最高次数

掌握以上内容,配合真题练习,校验码部分即可轻松得分。


发布日期:2026-09-02

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询