校验码,是在计算机进行数据传输的过程中,为了提高数据的可靠性设计的,一般是在信息位以外增加校验位来实现,分为多种编码形式。
名称 | 特点 |
---|---|
奇偶校验码 | 能校验,不能纠错。 |
循环冗余校验CRC | 能校验,不能纠错。 |
海明码校验 | 能校验,也能纠错。 |
1. 奇偶校验码
奇偶校验码由若干位有效信息的头部或者尾部(信息位),加上一个二进制位(校验位)组成。奇校验码即整个校验码中1的个数为奇数;偶校验码即整个校验码中1的个数为偶数。
信息位 | 校验位 | 校验码 | |
---|---|---|---|
奇校验码 | 1001101 | 1 | 10011011 |
偶校验码 | 1001101 | 0 | 10011010 |
注意,
如果有奇数个位产生错误码,则奇偶性发生变化,可以校验出误码,但不能纠错;
如果有偶数个位产生错误码,则奇偶性未发生变化,无法校验出误码(又称“漏检”)。
例如:
编码 | 错误数 | 误码 | 结果 |
---|---|---|---|
1011 | 奇数 | 1001 | 奇校验发生变化。 |
1011 | 偶数 | 1000 | 奇校验未发生变化,漏检。 |
1111 | 奇数 | 1011 | 偶校验发生变化。 |
1111 | 偶数 | 1001 | 偶校验未发生变化,漏检。 |
2. 循环冗余校验(CRC)
CRC可以检错,但不能纠错;检错能力强,漏检率低;虽然运算过程较复杂,但利于计算机硬件实现;广泛应用于数据链路。
学习循环冗余校验码,我们需要先了解异或运算和模2除法运算。
2.1 异或运算
异或运算,相同为0,不同为1。
0⊕0 = 0;0⊕1=1;1⊕0=1;1⊕1=0.
异或运算 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
2.2 模2除法运算
运算过程概括:
第一步,被除数首位是几商就取几;
第二步,异或运算;
第三步,异或后余数去首位(肯定是0);
第四步,补末位(落数),再上商。
第五步,循环计算至余数位数不足除数位数时,得余数结果。
示例题:
计算1011 0010 000 模2除 1100 1。
解题:
序号 | 运算事项 | 值 | 过程 | 结果 |
---|---|---|---|---|
1 | 被除数首位是几商就取几。 | 1011 0010 000 | 首位是1。 | 商1 |
2 | 异或运算 | 10110⊕11001 | 详见2.1 异或运算 | 01111 |
3 | 异或后去掉首位(肯定是0)。 | 01111 | 去掉首位0 | 1111 |
4 | 补末位(落数),再上商。 | 1111 | 从被除数落下一位(即0),再取首位上商(即1)。 | 11110 |
5 | 循环至余数位数不足除数位数时,得余数结果。 | 10110010000/11001 | 继续循环1、2、3、4,最后余数1010已不足被除数5位。 | 结果为1101010,余数为1010。 |
2.3 CRC循环冗余校验过程
CRC循环冗余校验,个人认为可以理解是一种对称加密算法,整个校验过程分为以下三步:
- 第一步,双方约定一个生成多项式G(x)。注意,算法要求生成多项式必须包含最低次项。
例如:约定G(x) = x4+x2+x+1,则第二、三步中模2运算的除数为10111。转换过程如下表所示:
生成多项式 | 最低次项 | ||||
---|---|---|---|---|---|
G(x) | x4 | x2 | x | 1 | |
G(x)完整版 | 1 * x4 | 0 * x3 | 1 * x2 | 1 * x1 | 1*x0 |
比特串 | 1 | 0 | 1 | 1 | 1 |
- 第二步, 发送方基于待发送的数据和生成多项式计算出差错检查码(即:冗余码),将其添加在待传输数据的后面一起发送。
- 第三步, 接收方基于接收到的数据和生成多项式计算是否产生了误码。
2.4 CRC真题演练
题目: 发送方,待发送数据为101001,双方约定生成多项式G(x)=x3+x2+1,请计算编码后信息。 接收方,接收到的数据为101101001,判断传输是否产生误码。
解题:
首先,处理发送方的待发送数据。
序号 | 运算事项 | 值 | 过程 | 结果 |
---|---|---|---|---|
1 | 将生成多项式转为比特串 | G(x)=x3 +x2+1 | 1 * x3+1 * x2+0 * x1+1 * x0 | 1101 |
2 | 构造被除数 | 101001 | 将待发送数据后面添加生成多项式最高次数个0(本题为3) | 101001000 |
3 | 模2除法运算 | 101001000/1101 | 详见2.2 模2除法运算 | 余数为0001,去掉前面0,余1。 |
4 | 冗余码 | 1 | 位数应与生成多项式最高次数相同(即3位),不足则前面补0。 | 001 |
5 | 编码后信息 | 101001 | 将冗余码添加在待发送数据后一起发送。 | 101001 001 |
其次,校验接收方接收到的数据。
序号 | 运算事项 | 值 | 过程 | 结果 |
---|---|---|---|---|
1 | 将生成多项式转为比特串 | G(x)=x3 +x2+1 | 1 * x3+1 * x2+0 * x1+1 * x0 | 1101 |
2 | 构造被除数 | 101101001 | 接收到的数据就是被除数。 | 101101001 |
3 | 模2除法运算 | 101101001/1101 | 详见2.2 模2除法运算 | 余数为11。 |
4 | 检查余数 | 11 | 余数为0,传输过程无误码;余数不为0,传输过程产生误码。 | 有误码 |
3. 海明码
海明码是利用奇偶性进行校验。 什么是奇偶性校验?——看“1. 奇偶校验码”。
海明码的编码规则如下:
说在前面:Dn代表数据码,Pk代表校验码,Hn+k代表海明码。
- 校验位数,公式:2k-1 >= n+k。例如:数据码为1001,n为4,则k为3满足公式,即校验位数为3 。
- 校验码Pi要放在2i-1的海明码位上。
- 海明码中任何一位都是由若干个校验码校验。
- 海明码中的校验码由自身校验。
- 被校验的海明码下标 = 所有参与校验的校验码下表之和。
3.1 海明真题演练
题目: 待传输数据码为1010,采用海明校验,请分别输出奇偶规则下的海明码。
解题:
首先,设定数据码为D,数据位数n为4,即D4;校验码为P,校验位数k,即Pk;海明码H,海明位数n+k,即Hn+k。
其次,计算校验位k,公式 2k-1 >= n+k,条件n = 4,则 2k >= 5+k,推导出k=3,即可满足公式。所以海明码位数为n+k=7,即H7。
现在,我们分别知道了数据码D4=1010,P3=? ? ? ,H7= ? ? ? ? ? ? ? 。
然后,计算校验码在海明码中的位数,pk放在海明码2k-1的下标位上。前面我们已经推导出k=3,所以校验码为P1、P2、P3 ,那么他们分别在海明码的位置如下:
21-1 = 1
22-1 = 2
23-1 = 4
所以,海明码中的校验码位置如下表所示:
海明码 | H1 | H2 | H3 | H4 | H5 | H6 | H7 |
---|---|---|---|---|---|---|---|
数据码 | D1 | D2 | D3 | D4 | |||
校验码 | P1 | P2 | P3 | ||||
海明码值 | ? | ? | 1 | ? | 0 | 1 | 0 |
注意,海明码中的校验位确定后,数据位自动按顺序填充进海明码。
接着,就该求校验码的奇偶值了,这里仔细回顾编码规则中的3、4、5条,如下表所示:
校验码 | P1 | P2 | P3 | ||
---|---|---|---|---|---|
校验码在海明码中的下标位数 | 1 | 2 | 4 | ||
海明码 / 校验码、数据码 | 数据码值 | 校验规则 | 是否参与校验 | 是否参与校验 | 是否参与校验 |
H1/P1 | 校验码校验自身 | 是 | |||
H2 /P2 | 校验码校验自身 | 是 | |||
H3/D1 | 1 | 计算下标之和,3=1+2 | 是 | 是 | |
H4 /P3 | 校验码校验自身 | 是 | |||
H5/D2 | 0 | 计算下标之和,5=1+4 | 是 | 是 | |
H6/D3 | 1 | 计算下标之和,6=2+4 | 是 | 是 | |
H7/D4 | 0 | 计算下标之和,7=1+2+4 | 是 | 是 | 是 |
统计上表中“是否参与校验”为“是”的情况得出校验码。
按照校验码列,自上而下取参与校验的数据码的值(排除校验码自身),结果如下:
P1 = 1 0 0
P2 = 1 1 0
P3 = 0 1 0
根据以上结果取奇偶值,如下表所示:
校验码 | 参与校验结果 | 奇校验规则 | 偶校验规则 |
---|---|---|---|
P1 | 1 0 0 | 0 | 1 |
P2 | 1 1 0 | 1 | 0 |
P3 | 0 1 0 | 0 | 1 |
所以,最终结果分别是奇校验规则(0110010) 和 偶校验规则(1011010)。
海明码 | H1 | H2 | H3 | H4 | H5 | H6 | H7 |
---|---|---|---|---|---|---|---|
数据码 | D1 | D2 | D3 | D4 | |||
校验码 | P1 | P2 | P3 | ||||
海明码值(奇校验规则) | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
海明码值(偶校验规则) | 1 | 0 | 1 | 1 | 0 | 1 | 0 |