常见的数据校验方法

校验,是为保护数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。当接收方用同样的算法再算一次校验值,如果两次校验值一样,表示数据完整。

 1. 奇偶校验

实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来传送奇/偶校验位来检验错误。

奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:

1 0110,0101

0 0110,0001

偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:

1 0100,0101

0 0100,0001

 2.  bcc异或校验法

实现方法:将所有数据都和一个指定的初始值(通常是0)异或一次,所得结果为校验值。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。 

特点:应用于很多基于串口的通讯方法。

3.md5校验和数字签名

实现方法:主要有md5和des算法。 

适用范围:数据比较大或要求比较高的场合。如md5用于大量数据、文件校验,des用于保密数据的校验(数字签名)等等。 

应用例子:文件校验、银行系统的交易数据 

如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送。
4. CRC算法

CRC原理介绍(通俗讲) 
1、发送端 
1.1、在发送端先将数据分组,每组k个数据。假定要传送的数据是M。 
1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。 
虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。

1.3、冗余码可以用下面的方法得出: 
3.1、用二进制模2运算进行2^n*M(相当于M左移n位)的运算。意思就是在M后面补n个0。现在M就变成了k+n位。 
1.3.2、用M除以收发双方事先商定的长度为n+1的除数P。 
1.3.3、得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。

2、接受端 
2.1、在接受端把接受到的数据以帧为单位进行CRC校验 
2.2、把收到的每一个帧都除以同样的除数P,然后检查余数R。 
2.3、如果余数R为0,如果在传输过程中没有差错。 
2.4、如果出现误码,那么余数R为零的概率是非常小的。

总结:在接收端对接收到的每一帧进行CRC检验后,若余数R为,则表示这个帧没有错,就接受。若R不为0,则判定这个帧出错,就丢弃。

标准CRC生成多项式如下表:

  名称       生成多项式             简记式*  标准引用
   CRC-4      x4+x+1                 3         ITU G.704
   CRC-8      x8+x5+x4+1             0x31                   
   CRC-8      x8+x2+x1+1             0x07                   
   CRC-8      x8+x6+x4+x3+x2+x1       0x5E
   CRC-12     x12+x11+x3+x+1          80F
   CRC-16     x16+x15+x2+1           8005      IBM SDLC
   CRC16-CCITTx16+x12+x5+1           1021      ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
   CRC-32      x32+x26+x23+...+x2+x+104C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
   CRC-32c     x32+x28+x27+...+x8+x6+1 1EDC6F41SCTP
                             
   生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。

 可以参考这篇博客:https://blog.csdn.net/xinyuan510214/article/details/80104356

发布了17 篇原创文章 · 获赞 2 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/toove/article/details/98962908
今日推荐