数据校验的六种方式-转载
一、为什么要进行数据校验
数据校验是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,说明数据是完整的。
二、校验方法
1、最简单的校验
最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。
例如:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。
2、奇偶校验(Parity Check)
在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。
应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。、
3、BCC异或校验法(block check character,块校验码)
很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
校验值计算的代码类似于:
[cpp]view plaincopy
unsigned uCRC=0;//校验初始值
for(inti=0;i
适用范围:适用于大多数要求不高的数据通讯。
应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。
4、LRC纵向冗余校验(Longitudinal Redundancy Check)
实现方式:将ASCII码帧中的头和尾去掉,将串中的每个字节变成16进制相加,再讲结果取反加1(补码),就是VRC(vertical redundant code,垂直冗余码)了。
应用例子:在行列格式中(如磁带)。
5、CRC(Cyclic Redundancy Check,循环冗余校验)循环冗余校验
它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
根据应用环境与习惯的不同,CRC又可分为以下几种标准:
①CRC-12码;
②CRC-16码;
③CRC-CCITT码;
④CRC-32码。
CRC-12码通常用来传送6-bit字符串。
CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。
CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
CRC的计算过程如下:
(1)设置CRC寄存器,并将其赋值位FFFF(HEX码)。
(2)将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并将结果保存到CRC寄存器中。
(3)将CRC寄存器向右移1位,MSB(Most Significant Bit,最高有效位)补0,移出并检查LSB(Lease
Significant Bit,最低有效位)。
(4)如果LSB为0,重复 “第3步”。若LSB为1,CRC寄存器与多项式码相抑或,
(5)重复 “第3步” 到 “第4步” 直到8次移位全部完成。此时一个9-bit数据处理完毕。
(6)重复 “第2步” 到 “第5步” 直到所有数据全部处理完毕。
(7)最终CRC寄存器的值就是CRC的值了。
现在应用最多的就是 CRC32 算法,它产生一个4字节(32位)的校验值,一般是以8位十六进制数,如FA 12 CD
45等。CRC算法的优点在于简便、速度快,严格的来说,CRC更应该被称为数据校验算法,但其功能与数据摘要算法类似,因此也作为测试的可选算法。
在 WinRAR、WinZIP 等软件中,也是以 CRC32 作为文件校验算法的。一般常见的简单文件校验(Simple File Verify – SFV)也是以 CRC32算法为基础,它通过生成一个后缀名为 .SFV 的文本文件,这样可以任何时候可以将文件内容 CRC32运算的结果与 .SFV 文件中的值对比来确定此文件的完整性。
适用范围:CRC-12码通常用来传送6-bit字符串;CRC-16及CRC-CCITT码则用是来传送8-bit字符。CRC-32:硬盘数据,网络传输等。
应用例子:rar 以及太网卡芯片、MPEG解码芯片中
6、MD5、SHA、MAC等摘要算法
摘要算法用于数据量比较大的场合。它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为
.md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV
类似的方法来检查文件完整性,绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。