软考知识点
来源:互联网 发布: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个校验位可以有
设 k个校验码为 P1,P2…Pk, n个数据位为D0,D1…Dn ,产生的海明码为 H1,H2…H(n+k)
例如有8个数据位,根据
然后怎么知道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的值怎么确定,如果使用偶校验,则
奇校验的话把偶校验的值取反即可.
那怎么校验错误呢.
其实也很简单. 先做下面运算.
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)去除它,如果有余数,则传输有错误。
计算校验和的方法如下:
- 软考知识点
- 软考知识点
- 软考知识点总结
- 软考二进宫-必考知识点
- 软考上午小知识点备忘
- 软考系统分析师 知识点杂碎 -1
- 软考知识点-战略管理过程
- 软考知识点-信息安全技术基础
- 【软考3】知识点的宏观总结
- 软考中级职称 软件工程师 学习知识点记录
- 【软考之路】UML知识点总结
- 【软考篇】--软考知识点总结(一)
- 软考二进宫-总结知识点1
- 软考二进宫-总结知识点2
- 软考二进宫-总结知识点3
- 【软考篇】--软考知识点总结(二)
- 软考网络工程师下午考试知识点整理
- 软考复习知识点自我总结
- 蓝桥杯之反幻方
- egret 必须先添加监听再设置skin
- BZOJ 4399: 魔法少女LJJ
- Android中的dex、apk、ClassLoader详解
- multiselect选项框
- 软考知识点
- Pandas 通用方法
- js排序后的状态如何在后端保存
- 对于LayoutInflater.from(parent.getContext()).inflate()方法的笔记
- 正确使用第三方iOS代码
- java数组--冒泡排序
- 安卓高仿IOS按钮
- 软件设计原则(七)合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
- 一分钟了解JAVA代理模式