校验码
在开发中,为了保证数据的安全性和正确性,防止数据被篡改,这时候就需要对数据进行安全和正确性检测。
这个时候就需要使用到校验码的场景
常规校验码分类:奇偶校验码,海明码校验,CRC校验码(循环冗余校验码)
奇偶校验
说白了就是对当前字节的二进制的1个数进行校验。
奇偶校验包括:奇校验和偶校验,任选其中一种即可。
-
奇校验:原始码流+校验位 总共有奇数个1
-
偶校验:原始码流+校验位 总共有偶数个1
原理:
原始码流后面,加上校验位,这个校验位可能是0也可能是1.并且它的校验码还可以放在码流的前面
如下图
应用举例:
例如下图有5组原始码,校验位的计算方法如下。红色代表校验位。
奇偶校验最常见的一个常见进行对ASCII码进行校验。
ASCII码低7位是有效数据位,第8位位奇偶校验位。
对于上面的大小字母A:码流:01000001
使用奇校验:码流+校验位:11000001
如果错1位:变为了11000011->此时有偶数个1,可以分析出错误。
如果错2位:变为了11000111->此时有奇数个1,无法分析出错误。
如果错3位:变为了11001111->此时有偶数个1,可以分析出错误。
使用偶校验:码流+校验位:01000001
如果错1位:变为了01000011->此时有奇数个1,可以分析出错误。
如果错2位:变为了01000111->此时有偶数个1,无法分析出错误。
如果错3位:变为了01001111->此时有奇数个1,可以分析出错误。
优缺点:
通过上面的分析我们也可以看到,奇偶校验的优点就是使用简单,缺点就是很多错误场景无法校验。
对安全性比较高得场景一般不推荐。
海明码校验
海明码是由贝尔实验室得Richard Hamming设计得,是一种利用奇偶性检错和纠错得方法,其基本原理是在原始码流特定位置上插入k个校验位,通过扩大码距来实现。
-
1.海明码的特点:m+k≤2k次方−1
m:表示数据位长度,k表示需要插入得最小校验码位数。
k位海明校验码一共可以表示2k2�种校验信息结果,其中有一种要用来表示没有出错的情况,则其余还剩2k2�-1种结果,为了使校验结果可以指出任一位出错的位置,则需要满足以上不等式。
-
举例说明:
发送端:设要传输的数据为101101100
(1):当前数据得长度位9,也就是m=9,由公式m+k<=2k次方+1,可以算出此时k最小值位4,所以总共要传输的数据位数为9+4=13;
(2):海明码校验码放在2得n次方位(n = 0,1...k-1),本例中k位4,所有海明码应该放在1,2,4,8号位置上。在下表中把这几位空出来。
索引号 1 2 3 4 5 6 7 8 9 10 11 12 13 H1 H2 1 H4 0 1 1 H8 0 1 1 0 0 (3)列出进制转换表:
索引号 8 4 2 1 3 0 0 1 1 5 0 1 0 1 6 0 1 1 0 7 0 1 1 1 9 1 0 0 1 10 1 0 1 0 11 1 0 1 1 12 1 1 0 0 13 1 1 0 1 上表中,先说每一行的内容:从第二行开始,每一行的第一列代表索引号,这个索引号是除去了海明校验位之外的其他所有位。后面几列为该索引号对应的二进制表示,其位数取决于第(1)步计算得出的海明校验码的位数,比如第二行,索引号是3,十进制3对应的二进制就是0011,之所以用4位表示是因为这段信息码需要4个海明校验位。
再看列信息:第一行得最后一列出现1的,就表示可以用第H1位完成校验,出现数字0则表示不能用H1位进行校验,因此,由上表可知:
校验位H1负责校验:第3,5,7,9,11,13位(上表黄色高亮显示部分),对应位置上的值进行异或得:1⊕0⊕1⊕0⊕1⊕0=1,由于海明校验做的是偶校验,则H1=1;
校验位H2负责校验:第3,6,7,10,11位(上表蓝色高亮显示部分),对应位置上的值进行异或得:1⊕1⊕1⊕1⊕1=1; 校验位H4负责校验:第5,6,7,12,13位,对应位置上的值进行异或得:0⊕1⊕1⊕0⊕0=0; 校验位H8负责校验:第9,10,11,12,13位,对应位置上的值进行异或得:0⊕1⊕1⊕0⊕0=0。
(4)得到最终要传输的数据串为
索引号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 1 1 0 0 1 1 0 0 1 1 0 0 接收端:
(1)进行校验
假设第10位发生了错误:
索引号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 1 1 0 0 1 1 0 0 0 1 0 0 接收方先按照第③步中类似的方式进行计算校验,区别在于要加上校验位自身这一位,即:
C1的值为第H1,3,5,7,9,11,13位上的值进行异或,1⊕1⊕0⊕1⊕0⊕1⊕0 = 0
C2的值为第H2,3,6,7,10,11位上的值进行异或,1⊕1⊕1⊕1⊕0⊕1=1
C4的值为第H4,5,6,7,12,13位上的值进行异或,0⊕0⊕1⊕1⊕0⊕0 = 0
C8的值为第H8,9,10,11,12,13位上的值进行异或,0⊕0⊕0⊕1⊕0⊕0= 1
(2)错误码判断
判断原则:
-
1.由于海明码使用得是偶校验,所以可以判断C1和C4中对应得位是没有出错的。
-
2.找到C2和C8中共同得位,然后剔除掉C4中得位,就可以得到正确得位,此时可以判断出C2和C8中共同得位是10和11,11在C1中出现了,所以剔除,只剩下C10,即得到这个位是错误的。
-
CRC校验
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
基本原理:
其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“ 模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“ 模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
CRC校验步骤:
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤:
- 1.选定合适的除数
- 2.看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
- 3.将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
CRC校验码计算示例:
现假设选择的 CRC生成多项式为 G( X) = X4 + X3 + 1,要求出二进制序列 10110011的 CRC校验码。下面是具体的计算过程 :
①将多项式转化为二进制序列,由 G( X) = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001 ②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为 101100110000,然后使用模2除法除以除数 11001,得到余数。
③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为**10110011*0100*,**再把这个数据帧发送到接收端。
④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。
总结
本片文章讲解了3种常见的数据校验法:奇偶校验,海明码校验,CRC校验。
通过原理和实际校验,和例子对它们进行了阐述,希望大家看完都能理解下来。
参考