Skip to content

校验码

码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。

一般来说,码距越大,越利于纠错和检错。


码距:两个编码之间至少需要改变的位数。码距越大,检错纠错能力越强。

校验码能力关键特性
奇偶校验检错(仅奇数位)增加 1 位校验位使 1 的个数为奇/偶,码距=2,不能纠错
海明码检错 + 纠错(1位)校验位在 2 的幂次方位置(1,2,4,8...),公式 2^k ≥ n+k+1
CRC检错模 2 除法(异或),只能检错不能纠错,约定生成多项式 G(x)

海明码解题流程:确定校验位数量 k(2^k ≥ n+k+1)→ 校验位放 2 的幂次方位置 → 按位负责关系计算各校验位(偶校验)→ 写出编码。

CRC 解题流程:原始信息后补 r 个 0(r = G(x) 最高次)→ G(x) 转二进制除数 → 模 2 除法得余数 → 拼接发送。

奇偶校验码

在编码中增加1位校验位来使编码中1的个数为奇数(奇校验)或者偶数(偶校验),从而使码距变为2。

奇校验可以检测编码中奇数个数据位出错,即当合法编码中的奇数位发生了错误时,即编码中的1变成0或者0变成1,则该编码中1的个数的奇偶性就发生了变化,从而检查出错误。

但无法纠错

循环冗余校验码 CRC

CRC只能检错,不能纠错,

其原理是找出一个能整除多项式的编码,因此首先要将原始报文除以多项式,将所得的余数作为校验位加在原始报文之后,作为发送数据发给接收方。

使用CRC编码,需要先约定一个生成多项式G(x)。生成多项式的最高位和最低位必须是1。假设原始信息有位,则对应多项式M(x)。生成校验码思想就是在原始信息位后追加若干校验位,使得追加的信息能被G(x)整除。接收方接收到带校验位的信息,然后用G(x)整除。余数为0,则没有错误;反之则发生错误。


:假设原始信息串为 10110,CRC 的生成多项式为 ( G(x)=x^4+x+1 ),求 CRC 校验码。

  • (1)确定生成多项式的阶数并添零

生成多项式的最高次幂为 ( r = 4 )。

在原始信息位后添加 ( r ) 个 0,得到被除数:

10110 + 0000 = 101100000

  • (2)由多项式得到除数(生成多项式对应的二进制串)

多项式 ( x^4 + x + 1 ) 中,幂指数 4、1、0 的系数为 1,幂指数 3、2 的系数为 0。

因此对应的二进制串为 10011(从 ( x^4 ) 到 ( x^0 ) 排列)。

  • (3)模 2 除法计算 CRC 校验码

模 2 除法采用异或运算(不进位、不借位)。

将被除数 101100000 与除数 10011 进行模 2 除,过程如下:

image.png

得到余数 1111

注意:余数的位数应与生成多项式的阶数 ( r ) 相同。若余数不足 ( r ) 位,则需要在左边补 0 至 ( r ) 位。本例余数为 4 位,无需补齐。

  • (4)生成最终发送的信息串

将计算得到的 CRC 校验码(余数)附加在原始信息串后面:
原始信息 10110 + 余数 1111 = 101101111
发送方将此数据帧发送给接收方。

  • (5)接收方校验

接收方收到带校验码的帧后,用相同的生成多项式 10011 进行模 2 除法。

  • 若余数为 0,说明传输无错误(或错误概率极低);
  • 若余数不为 0,则说明数据在传输过程中发生了错误,请求发送方重传。

注意:收发信息双方需使用相同的生成多项式。