软考知识点

来源:互联网 发布:python循环读取文件 编辑:程序博客网 时间:2024/05/16 18:25

一、奇偶校验码

奇偶校验码是奇校验码和偶校验码的统称.。
如果是奇校验,加上校验位后,编码中1的个数为奇数个
如果是偶校验,加上校验位后,编码中1的个数为偶数个
例:
原编码 奇校验 偶校验
0000 0000 1 0000 0
0010 0010 0 0010 1
1100 1100 1 1100 0
1010 1010 1 1010 0

目前应用的奇偶校验码有3种.:
1、水平奇偶校验码
对每一个数据的编码添加校验位,使信息位与校验位处于同一行.
2、垂直奇偶校验码
把数据分成若干组,一组数据排成一行,再加一行校验码.
针对每一行列采用奇校验或偶校验
例: 有32位数据10100101 00110110 11001100 10101011
   垂直奇校验 垂直偶校验
   10100101 10100101
   00110110 00110110
   11001100 11001100
   10101011 10101011
校验为00001011 11110100
3、水平垂直奇偶校验码
就是同时用水平校验和垂直校验
例:
   奇校验 奇水平 偶校验  偶水平
  10100101  1 10100101  0
  00110110  1 00110110  0
  11001100  1 11001100  0
  10101011  0 10101011  1
校验00001011  0 11110100  1

二、海明校验码

海明码也是利用奇偶性来校验数据的,它是一种多重奇偶校验检错系统,它通过在数据位之间插入k个校验位,来扩大码距,从而实现检错和纠错.
设原来数据有n位,要加入k位校验码,k个校验位可以有2k个编码,其中有一个代表是否出错。剩下2k1个编码则用来表示到底是哪一位出错. 因为n个数据位和k个校验位都可能出错,所以k要满足2k1n+k

设 k个校验码为 P1,P2…Pk, n个数据位为D0,D1…Dn ,产生的海明码为 H1,H2…H(n+k)
例如有8个数据位,根据2k1n+k可以知道k最小是4 。校验码的位置很容易确定的,那就是校验码必须是在2的n次方位,如第1、2、4、8、16、32,……位,信息码的分布位置就是非2的n次方位置,如第3、5、6、7、9、10、11、12、13,……位(是从最左边的位数起的)。那么得到的海明码是

H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1 D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1

然后怎么知道Pi校验哪个位呢,可以列个校验关系表
海明码 下标 校验位组
H1(P1) 1 P1
H2(P2) 2 P2
H3(D0) 1+2 P1,P2
H4(P3) 4 P3
H5(D1) 1+4 P1,P2
H6(D2) 2+4 P2,P3
H7(D3) 1+2+4 P1,P2,P3
H8(P4) 8 P4
H9(D4) 1+8 P1,P4
H10(D5) 2+8 P2,P4
H11(D6) 1+2+8 P1,P2,P4
H12(D7) 4+8 P3,P4

从表中可以看出
P1校验 P1,D0,D1,D3,D4,D6
P2校验 P2,D0,D2,D3,D5,D6
P3校验 P3,D1,D2,D3,D7
P4校验 P4,D4,D5,D6,D7

要知道海明码Hi由哪些校验组校验,可以把i化成 二进制数 数中哪些位k是1,就有哪些Pk校验
如H7 7=0111 所以由P1,P2,P3
H11 11=1011 所以由P1,P2,P4
H3 3=0011 所以由P1,P2
那看看Pi的值怎么确定,如果使用偶校验,则
P1=D0D1D3D4D6
P2=D0D2D3D5D6
P3=D1D2D3D7
P4=D4D5D6D7
奇校验的话把偶校验的值取反即可.

那怎么校验错误呢.
其实也很简单. 先做下面运算.
G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6
G2 = P2 xor D0 xor D2 xor D3 xor D5 xor D6
G3 = P3 xor D1 xor D2 xor D3 xor D7
G4 = P4 xor D4 xor D5 xor D6 xor D7

如果用偶校验那么 G4G3G2G1 全为0是表示无错误(奇校验全为1)
当不全为0表示有错 G4G3G2G1 的十进制值代表出错的位.
如 G4G3G2G1 =1010 表示H10(D5)出错了.
把它求反就可以纠正错误了.

下面举一个比较完全的例子:
设数据为01101001,试用4个校验位求其偶校验方式的海明码.
传输后数据为011101001101,是否有错?
P1=D0 xor D1 xor D3 xor D4 xor D6
=1 xor 0 xor 1 xor 0 xor 1
=1

P2=D0 xor D2 xor D3 xor D5 xor D6
=1 xor 0 xor 1 xor 1 xor 1
=0

P3=D1 xor D2 xor D3 xor D7
=0 xor 0 xor 1 xor 0
=1

P4=D4 xor D5 xor D6 xor D7
=0 xor 1 xor 1 xor 0
=0

所以得到的海明码为
0 1 1 0 0 1 0 0 1 1 0 1

传输后为011101001101
G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6
=1
G2 = P2 xor D0 xor D2 xor D3 xor D5 xor D6
=0
G3 = P3 xor D1 xor D2 xor D3 xor D7
=0
G4 = P4 xor D4 xor D5 xor D6 xor D7
=1

所以1001代表9即H9出错了,对它求反
011001001101 和我们算的一样.
由此可见 海明码 不但有检错还有纠错能力

CRC:循环冗余校验码

CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码.
现在简单介绍下它的原理:
在k位信息码后接r位校验码,对于一个给定的(n,k)码
可以证明(数学高手自己琢磨证明过程)存在一个最高次幂为 n-k=r 的多项式g(x)
根据g(x)可以生成k位信息的校验码,g(x)被称为 生成多项式
用C(x)=C(k-1)C(k-2)…C0表示k个信息位
把C(x)左移r位,就是相当于 C(x)*pow(2,r)
给校验位空出r个位来了.

给定一个 生成多项式g(x),可以求出一个校验位表达式r(x)
C(x)*pow(2,r) / g(x) = q(x) + r(x)/g(x)

用C(x)*pow(2,r)去除生成多项式g(x)商为q(x)余数是r(x)
所以有C(x)*pow(2,r) = q(x)*g(x) + r(x)

C(x)*pow(2,r) + r(x)就是所求的n位CRC码,由上式可以看出它是生成多项式g(x)的倍式.

所以如果用得到的n位CRC码去除g(x)如果余数是0,就证明数据正确.
否则可以根据余数知道 出错位 .

在CRC运算过程中,四则运算采用 mod 2运算(后面介绍),即不考虑进位和借位.
所以上式等价于C(x)*pow(2,r) + r(x) = q(x)*g(x)
继续前先说下基本概念吧.
1.多项式和二进制编码
x的最高次幂位对应二进制数的最高位.以下各位对应多项式的各幂次.
有此幂次项为1,无为0. x的最高幂次为r时, 对应的二进制数有r+1位
例如g(x)=pow(x,4) + pow(x,3) + x + 1
对应二进制编码是 11011

2.生成多项式
是发送方和接受方的一个约定,也是一个二进制数,在整个传输过程中,这个数不会变.
在发送方,利用 生成多项式 对信息多项式做 模2运算 生成校验码.
在接受方利用 生成多项式 对收到的 编码多项式 做 模2运算 校验和纠错.

生成多项式应满足:
a.生成多项式的最高位和最低位必须为1
b.当信息任何一位发生错误时,被生成多项式模2运算后应该使余数不为0
c.不同位发生错误时,应该使余数不同.
d.对余数继续做模2除,应使余数循环.

生成多项式很复杂
不过不用我们生成
下面给出一些常用的生成多项式表

N K 码距d G(x)多项式 G(x)
7 4 3 x3+x+1 1011
7 4 3 x3+x2+1 1101
7 3 4 x4+x3+x2+1 11101
7 3 4 x4+x2+x+1 10111
15 11 3 x4+x+1 10011
15 7 5 x8+x7+x6+x4+1 111010001
31 26 3 x5+x2+1 100101
31 21 5 x10+x9+x8+x6+x5+x3+1 11101101001
63 57 3 x6+x+1 1000011
63 51 5 x12+x10+x5+x4+x2+1 1010000110101
1041 1024   x16+x15+x2+1 11000000000000101
3.模2运算
a.加减法法则
0 +/- 0 = 0
0 +/- 1 = 1
1 +/- 0 = 1
1 +/- 1 = 0
注意:没有进位和借位

b.乘法法则
利用模2加求部分积之和,没有进位

c.除法法则
利用模2减求部分余数
没有借位
每商1位则部分余数减1位
余数最高位是1就商1,不是就商0
当部分余数的位数小于余数时,该余数就是最后余数.

例 1110
1011)1100000
1011
1110
1011
1010
1011
0010(每商1位则部分余数减1位,所以前两个0写出)
0000
010(当部分余数的位数小于余数时,该余数就是最后余数)
最后商是1110余数是010

好了说了那么多没用的理论.下面讲下CRC的实际应用

例: 给定的生成多项式g(x)=1011, 用(7,4)CRC码对C(x)=1010进行编码.

由题目可以知道下列的信息:
C(x)=1010,n=7,k=4,r=3,g(x)=1011

C(x)*pow(2,3)=1010000
C(x)*pow(2,3) / g(x) = 1001 + 011/1011
所以r(x)=011

所以要求的编码为1010011

例2: 上题中,数据传输后变为1000011,试用纠错机制纠错.
1000011 / g(x) = 1011 + 110/1011

不能整除,所以出错了. 因为余数是110
查1011出错位表可以知道是第5位出错.对其求反即可.

循环冗余校验码CRC(Cyclic Redundancy Code)采用一种多项式的编码方法。把要发送的数据位串看成是系数只能为“1”或为“0”的多项式。一个k位的数据块可以看成Xk-1到X0的k项多项式的系数序列。例如,“110001”有6位,表示多项式是“X5 + X4+ 1”。多项式的运算是模2运算。
采用CRC码时,发方和收方必须事先约定一个生成多项式G(X),并且G(X)的最高位和最低必须是1。要计算m位数据块的M(X)的校验和,生成多项式必须比该多项式短。其基本思想是:将校验和附加在该数据块的末尾,使这个带校验和的多项式能被G(X)除尽。当接收方收到带校验和的数据块时,用G(X)去除它,如果有余数,则传输有错误。
计算校验和的方法如下:

0 0
原创粉丝点击