-
奇偶校验码
-
海明校验码
-
循环冗余校验码
奇偶校验码
奇偶校验码是奇校验码和偶校验码的统称,是一种 「检错码」,用于检查二进制数据的 「位错」。
奇偶校验码分为奇校验码和偶校验码两种方法。
奇校验:1的个数为奇数
偶校验:1的个数为偶数
一、奇校验码
奇校验码在数据发送前,「检查」1的个数,「奇数」个1就在头部填充0,「偶数」个1就在头部填充1,使数据整体保持奇数个1;
接收数据时,重新检查1的个数:
「奇数」个则判定数据正常,去掉头部的填充符;
「偶数」个则判定数据出错,重新发送数据帧。二、偶校验码
偶校验码在数据发送前,也会「检查」1的个数,「偶数」个1就在头部填充0,「奇数」个1就在头部填充1,使数据整体保持偶数个1;
接收数据时,重新检查1的个数:
「偶数」个1则判定数据正常,去掉头部的填充符;
「奇数」个1则判定数据异常,重新发送数据帧。三、执行流程
例:求7位信息码1100111的奇校验码和偶校验码(设校验位在最低位)。
• (1) 1100111的奇校验码
• 因为1100111中“1”的个数为奇,所以奇校验位P=0,
• 1100111的奇校验码为11001110。
• (2) 1100111的偶校验码
• 因为1100111中“1”的个数为奇,所以偶校验位P=1,
• 1100111的偶校验码为11001111。四、缺点
以奇校验码为例
发送前的数据是: 1110
只有1个位发生错误,比如第一位的1变成了0:0110 ,这时候1的个数是偶数,可以检查出错误。
但是,当两个位同时发生错误时,比如第一位、第二位的1都变成了0:0010 ,这时候1的个数仍然是奇数,奇校验码默认数据正常,从而导致检错失败。所以奇偶校验码只能发现奇数位个错误,而无法发现偶数位个错误,而且即使
发现奇数位个错误也无法确定出错的位置,因而无法自动纠正错误。由于现代计算机可靠性比较高,出错概率很低,而出错中只有一位出错的
概率最高,因此用奇偶校验检测一位出错,能够满足一般可靠性要求。在
CPU与主存的信息传送过程中,奇偶校验被广泛应用。
海明校验码
实质:在奇偶校验的基础上,增加校验位的位数,构成多组奇偶校验,以便
发现错误并自动纠正错误。原则:
- 海明码只能检测出2位错,纠1位错。
- 海明码默认进行偶校验(除非特殊说明使用奇校验)。
- 海明码是一串由0和1组成的序列(除01外没有其他的值)
构成:
例如如下序列:
1100
我们想要让其变成海明码只需如下操作1.算出校验位数k
正常情况下我们需要如下此操作:
2^k >= k + 数据位数 + 1
这里等于3
2.确定校验位在海明码中的位置
这里按2^k次幂留出来,就像1,2,4,8,16,32。
3.分组
我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。
我们按这个规则进行分配。将1,2,4(海明码下标为1,2,4)
的二进制码写出来,并且最高位补到3位(前面算的K数)
如下所示:将1到7的二进制序列,列出来如下表
将7->1依次与上面的通配表进行匹配
因此可以确定
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验4.求出校验位是0还是1
因为上面我们得出以下结论:
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验
CRC校验码
释义:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
模2运算
循环冗余校验码是一种基于模2运算建立编码规律的校验码
(1) 模2加减:即按位加,用异或规则实现。即:0±0=0 0±1=1±0=1 1±1=0
(2) 模2乘:按模2加求部分积之和,不进位。
(3) 模2除:按模2减求部分余数,不借位。若部分余数(首次为被除数)最高位
为1,则上商为1;若部分余数最高位为0,则上商为0。每求一位商应使部分余
数减少一位,即去掉部分余数的最高位,再继续求下一位商。当部分余数的位
数小于除数位数时,该余数就是最后的余数。
CRC校验步骤:
CRC校验中有两个关键点:①预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,但是最高位和最低位必须为1;
②把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤:
- 选择合适的除数(最高位和最低位必须为1)
- 看选定除数的二进制位数,然后再要发送的数据帧上面加上(这个位数-1)位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
- 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错