ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

软考必考:校验码(奇偶校验、海明码、CRC循环冗余校验)最全详解

软考必考:校验码(奇偶校验、海明码、CRC循环冗余校验)最全详解 目标一文彻底掌握软考上午题中“校验码”所有考点。包含奇偶校验、海明码、CRC循环冗余校验的原理、计算过程、纠错方法、典型例题与解题技巧看完这篇无需再翻其他资料。一、校验码基本概念数据在传输或存储过程中可能因干扰产生错误校验码通过在原始数据中附加冗余信息来检测或纠正错误。常见校验码包括奇偶校验码只能检测奇数个错误不能纠错。海明码可以检测并纠正一位错误。循环冗余校验码CRC可以检测多位错误常用于数据通信和存储。软考重点考查海明码的构建与纠错过程、CRC的编码与校验计算。二、奇偶校验码1. 原理在原始数据后或前添加一位校验位使得整个码字中“1”的个数为奇数奇校验或偶数偶校验。奇校验添加校验位后码字中“1”的总个数为奇数。偶校验添加校验位后码字中“1”的总个数为偶数。2. 校验位计算设原始数据为n位校验位1位共n1位。若采用偶校验校验位 原始数据中“1”的个数 mod 2 的补即如果“1”的个数为奇数校验位为1如果为偶数校验位为0。若采用奇校验校验位 原始数据中“1”的个数 mod 2 的结果即如果“1”的个数为奇数校验位为0如果为偶数校验位为1。例子原始数据10110107位求偶校验位。其中“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”的个数若为偶数则正确奇数则错误。A4个1正确B5个1错误C5个1错误D4个1正确。因此B、C有误。但实际只能检测出有误无法判定是哪一位出错。三、海明码Hamming Code1. 原理海明码通过在数据位之间插入多个校验位并将每个校验位与不同组合的数据位进行奇偶校验通常采用偶校验接收方通过重新计算校验位并比较得到校验结果称为“指误字”或“伴随式”从而定位错误位实现纠错。2. 校验位位数与位置设数据位为k位校验位为r位总码长n k r。要求满足2^r ≥ k r 1或 2^r ≥ n 1即校验位的组合状态数足以表示无错和每个位置出错的情况。常见数据位与校验位对应数据位k校验位r总长n1232~435~75~1149~1512~26517~31校验位放在2的幂次位置上1,2,4,8,…其余位置按顺序放数据位。例如数据位4位k4需要r3总长7位置如下位置1234567用途P1P2D1P3D2D3D43. 校验位的计算每个校验位负责校验一组位置该组位置的特点是其二进制编号中对应校验位位置编号的二进制位为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”的个数为偶数。公式校验位 组内其他位数据位异或的结果对于偶校验。例子对数据10104位生成海明码偶校验。数据位D11, D20, D31, D40放在位置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到7P1 P2 D1 P3 D2 D3 D4 1 0 1 1 0 1 0即1011010。4. 检错与纠错过程接收方收到海明码后重新计算每个校验组包括接收到的校验位的偶校验结果得到r位指误字SS_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,7P1⊕D1⊕D2⊕D4 1⊕1⊕1⊕0 1 → S11组2位置2,3,6,7P2⊕D1⊕D3⊕D4 0⊕1⊕1⊕0 0 → S20组3位置4,5,6,7P3⊕D2⊕D3⊕D4 1⊕1⊕1⊕0 1 → S31指误字 S3 S2 S1 101二进制 5表示第5位出错。将第5位取反即可恢复。5. 软考常见题型构建海明码给定数据位求完整海明码含校验位。纠错给出接收到的海明码可能有一位错误判断哪一位出错并纠正。理论问题如海明码能纠正几位错误校验位位数如何确定等。例题设数据为01104位采用偶校验海明码求完整编码及若接收为1110110时是否有错错在哪位。构建数据位4校验位3总长7。位置1(P1),2(P2),3(D1),4(P3),5(D2),6(D3),7(D4)。数据D10,D21,D31,D40放入3,5,6,7。P1位置3,5,7异或 0⊕1⊕01P2位置3,6,7异或 0⊕1⊕01P3位置5,6,7异或 1⊕1⊕00完整码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 1S2 P2⊕D1⊕D3⊕D4 位置2⊕位置3⊕位置6⊕位置7 1⊕1⊕1⊕0 1S3 P3⊕D2⊕D3⊕D4 位置4⊕位置5⊕位置6⊕位置7 0⊕1⊕1⊕0 0指误字 S3S2S1 011二进制 3表示第3位出错。将第3位取反恢复为0得到原码1100110。四、CRC循环冗余校验Cyclic Redundancy Check1. 原理CRC是一种基于模2运算异或的校验码通过在数据后面添加校验位称为帧校验序列FCS使得整个数据帧能够被一个预先约定的生成多项式G(x)整除模2除法。接收方用同样的G(x)去除若余数为0则认为无错否则有错。2. 生成多项式生成多项式是收发双方约定的一个二进制序列通常用多项式表示如CRC-12G(x) x^12 x^11 x^3 x^2 x 1 二进制1100000001111CRC-16G(x) x^16 x^15 x^2 1 二进制11000000000000101CRC-CCITTG(x) x^16 x^12 x^5 1 二进制10001000000100001CRC-32广泛用于以太网。软考中常给出具体的生成多项式如 G(x)x3x21对应二进制1101因为x^3, x^2, 1的系数为1x^1系数为0。3. 编码过程求CRC校验码设原始数据为k位生成多项式G(x)的最高次为r则校验位为r位。步骤在原始数据后添加r个0形成被除数kr位。用该被除数与生成多项式对应的二进制序列进行模2除法异或得到r位余数。将余数替换步骤1中添加的r个0得到最终发送的码字kr位。模2除法规则按位异或不借位。每一步比较当前被除数的最高位与除数的最高位若为1则商1将除数与当前部分异或若为0则商0实际不操作向右移一位。直到被除数位数小于除数位数此时剩余部分为余数。例子数据1010016位生成多项式 G(x)x3x21二进制1101r3求CRC码。原始数据后加3个0101001 000。模2除法计算余数除数1101被除数101001000详细步骤101001000 1101 第一位商1异或 ------ 011101000 前导0舍去实际下一步用11101000 1101 商1因为当前位为1 ------ 001001000 - 1001000? 需要逐步展示我们使用更清晰的方法初始被除数 A 101001000除数 B 1101。第一次A前4位1010 与B 110110101101不够除但模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。逐次异或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 (移下01100最高位1) 1101 ------ 001 (余数3位)最终余数为001。因此校验位为001发送码字为原始数据校验位101001 001。4. 检错过程接收方将收到的码字kr位与生成多项式进行模2除法若余数为0则认为传输无误若余数不为0则有误。CRC可以检测多位错误但不能纠错除非知道错误模式。5. 软考常见题型给定数据和生成多项式求CRC校验码余数或完整发送数据。判断接收码字是否有误做除法看余数。概念题CRC能检测哪些错误如突发错误长度小于等于r时全部可检测等。例题设待发送数据为1101011011采用CRC校验生成多项式为10011即G(x)x^4x1求CRC校验码。解析生成多项式10011r4数据后加4个0被除数1101011011 0000。进行模2除法略去详细步骤可自行演算余数为1110。所以CRC码为1101011011 1110。接收方校验用11010110111110除以10011若余数为0则正确。五、三种校验码对比校验码类型检错能力纠错能力编码效率软考重点奇偶校验检测奇数个错误无高简单计算概念理解海明码可检错并定位一位错误纠正一位错误较低构建与纠错过程CRC检测多位错误突发错误能力强无较高编码与校验计算六、易错点与注意事项海明码校验位位置校验位放在1,2,4,8等2的幂次位置数据位依次填入其余位置。海明码指误字结果S_r…S_1的十进制值表示出错位置若为0则无错。注意顺序不要颠倒。奇偶校验只能检出奇数个错偶数个错漏检。CRC模2除法余数位数等于生成多项式最高次数不足时在前面补0。CRC发送码字原始数据余数校验位不是原始数据原始数据后加0的结果。生成多项式最高次与校验位位数r等于G(x)的最高次数如G(x)x3x21对应r3二进制1101。海明码与CRC的选择海明码多用于需要纠错的场合如内存CRC多用于网络通信检错。七、总结与速记奇偶校验加1位奇数个错可检不能纠错。海明码校验位个数满足2^r ≥ kr1校验位在2的幂次位通过异或计算指误字定位错误位。CRC数据后加r个0做模2除法余数为校验位接收方再除余数0则正确。速记公式海明码校验位位数2^r ≥ n1n为总长CRC校验位位数 生成多项式最高次数掌握以上内容配合真题练习校验码部分即可轻松得分。发布日期2026-09-02
返回列表