数据校验码
一、奇偶校验码(Parity Bit)
它是一种检错码。能发现代码中一位出错的情况,因为其利用的是编码中1的个数的奇偶性作为依据,所以不能发现偶数位错误。
二、海明校验码(Hamming Code)
假设校验位个数为 r,则它能表示 2r 种情况,用其中一种情况表示“没有出错”,其余 2r-1 种情况指出错误发生在哪一位,信息位加校验位总共有 k+r 位,因此发生错误的情况也有 k+r 种,于是 2r -1 需要能校验 k+r 种情况,也就是说要满足关系式:
2
r
⩾
k
+
r
+
1
{2^r} \geqslant k + r + 1
2r⩾k+r+1
1. 确定海明码的位数
信息 n 位,假设校验位 k 位,总共会有2k 种情形,除了一种正确的情况,其余2k - 1 要能满足编码后的数据位数。即 2k -1 ⩾ \geqslant ⩾ n + k
假设信息位为 1010
信息位有4位, 可以得出校验位k=3,设信息位
D
4
D_4
D4
D
3
D_3
D3
D
2
D_2
D2
D
1
D_1
D1,校验位
P
3
P_3
P3
P
2
P_2
P2
P
1
P_1
P1,那么对应的海明码为
H
7
H_7
H7
H
6
H_6
H6
H
5
H_5
H5
H
4
H_4
H4
H
3
H_3
H3
H
2
H_2
H2
H
1
H_1
H1
2. 确定校验码的分布
规定:校验码
P
i
P_i
Pi 放在海明码 2i-1 的位置上,信息位按顺序放在其余位置
如图:
H 7 H_7 H7 | H 6 H_6 H6 | H 5 H_5 H5 | H 4 H_4 H4 | H 3 H_3 H3 | H 2 H_2 H2 | H 1 H_1 H1 |
---|---|---|---|---|---|---|
D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | P 3 P_3 P3 | D 1 D_1 D1 | P 2 P_2 P2 | P 1 P_1 P1 |
1 | 0 | 1 | 0 |
3. 求校验位的值
D1 (在第3位): 0 1 1(3)
D2 (在第5位): 1 0 1 (5)
D3 (在第6位): 1 1 0(6)
D4 (在第7位): 1 1 1(7)
P1(在第1位): 0 0 1
P2(在第2位): 0 1 0
P3(在第3位): 1 0 0
因为需要根据校验位来确定在传输信息中哪一位出了错误,所以校验位要与信息位建立一定的关系:
(从右至左竖着看,P1、P2、P3各管一列)右第一列,第3、5、7位的数值都是1,于是将D1、D2、D4 和 P1分为一组;右第二列,第3、6、7位的数值都是1,将D1、D3、D4 和P2分为一组;右第三列,第5、6、7位的数值都是1,将D2、D3、D4 和P3分为一组
注意:题目中可能会要求使用奇校验或偶校验求P的值,此处以偶校验为例
P1 = D1
⊕
\oplus
⊕ D2
⊕
\oplus
⊕ D4 = 0
⊕
\oplus
⊕ 1
⊕
\oplus
⊕ 1 = 0
P2 = D1
⊕
\oplus
⊕ D3
⊕
\oplus
⊕ D4 = 0
⊕
\oplus
⊕ 0
⊕
\oplus
⊕ 1 = 1
P3 = D2
⊕
\oplus
⊕ D3
⊕
\oplus
⊕ D4 = 1
⊕
\oplus
⊕ 0
⊕
\oplus
⊕ 1 = 0
于是:
H 7 H_7 H7 | H 6 H_6 H6 | H 5 H_5 H5 | H 4 H_4 H4 | H 3 H_3 H3 | H 2 H_2 H2 | H 1 H_1 H1 |
---|---|---|---|---|---|---|
D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | P 3 P_3 P3 | D 1 D_1 D1 | P 2 P_2 P2 | P 1 P_1 P1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 |
4. 检错
检验方程:
S1 = P1
⊕
\oplus
⊕ D1
⊕
\oplus
⊕ D2
⊕
\oplus
⊕ D4
S2 = P2
⊕
\oplus
⊕ D1
⊕
\oplus
⊕ D3
⊕
\oplus
⊕ D4
S3 = P3
⊕
\oplus
⊕ D2
⊕
\oplus
⊕ D3
⊕
\oplus
⊕ D4
当接收到:1010010,可计算得出:
S1=0
S2=0
S3=0
当接收到:1010000
S1=0
S2=1
S3=0
说明第010位出错,即第2位出错
检验d位错,码距为d+1;纠正d位错,码距为2d+1
三、循环冗余校验码(Cyclic Redundancy Check)
基本思想
数据的发送方、接收方约定一个除数
K个信息为+R个校验位作为“被除数”,添加校验位后需保证除法的余数为0
收到数据后,进行除法检查余数是否为0,若余数非0则说明出错,则进行重传或者纠错
求解步骤
设生成多项式是G(x)=x3+x2+1,信息码为101001,求对应的CRC码
1、 确定K、R以及生成多项式对应的二进制码
K=信息码的长度=6
R=生成多项式的最高次幂=3
校验码的位数N=K+R=9
生成多项式G(x)= 1 * x3 + 1 * x2+ 0 * x1+ 1 * x0,对应二进制码 1101
2、移位
为了确定最低位R位的校验位,将信息码左移R位,低位先补0
101001000
3、相除
对移位后的信息码,用生成多项式进行模2除法,产生余数
得到的CRC码:101001 001
4、检错和纠错
发送:101001001 记为
C
9
C
8
C
7
C
6
C
5
C
4
C
3
C
2
C
1
C_{9}C_{8}C_{7}C_{6}C_{5}C_{4}C_{3}C_{2}C_{1}
C9C8C7C6C5C4C3C2C1
接收:101001001 用 1101 进行模2除,余数为000,代表没有出错
接收:101001011 用1101 进行模2除,余数为010,代表
出错位有可能是第2位或者第9位,说明CRC码不具备纠错能力。
若生成多项式选择得当,且
2
R
⩾
K
+
R
+
1
2^R\geqslant K+R+1
2R⩾K+R+1,则CRC码可纠正1位错。
理论上,CRC码可以:
- 检测所有奇数位个错误
- 检测出所有双比特的错误
- 检测出所有小于等于检验位长度的连续错误