數(shù)據(jù)校驗的六種方式-轉(zhuǎn)載

一、為什么要進行數(shù)據(jù)校驗

數(shù)據(jù)校驗是為保證數(shù)據(jù)的完整性,用一種指定的算法對原始數(shù)據(jù)計算出的一個校驗值。接收方用同樣的算法計算一次校驗值,如果和隨數(shù)據(jù)提供的校驗值一樣,說明數(shù)據(jù)是完整的。

二、校驗方法

1、最簡單的校驗

最簡單的校驗就是把原始數(shù)據(jù)和待比較數(shù)據(jù)直接進行比較,看是否完全一樣這種方法是最安全最準確的。同時也是效率最低的。

例如:龍珠cpu在線調(diào)試工具bbug.exe。它和龍珠cpu間通訊時,bbug發(fā)送一個字節(jié)cpu返回收到的字節(jié),bbug確認是剛才發(fā)送字節(jié)后才繼續(xù)發(fā)送下一個字節(jié)的。

2、奇偶校驗(Parity Check)

在數(shù)據(jù)存儲和傳輸中,字節(jié)中額外增加一個比特位,用來檢驗錯誤。校驗位可以通過數(shù)據(jù)位異或計算出來。

應(yīng)用例子:單片機串口通訊有一模式就是8位數(shù)據(jù)通訊,另加第9位用于放校驗值。、

3、BCC異或校驗法(block check character,塊校驗碼)

很多基于串口的通訊都用這種既簡單又相當準確的方法。它就是把所有數(shù)據(jù)都和一個指定的初始值(通常是0)異或一次,最后的結(jié)果就是校驗值,通常把它附在通訊數(shù)據(jù)的最后一起發(fā)送出去。接收方收到數(shù)據(jù)后自己也計算一次異或和校驗值,如果和收到的校驗值一致就說明收到的數(shù)據(jù)是完整的。

校驗值計算的代碼類似于:

[cpp]view plaincopy

unsigned?uCRC=0;//校驗初始值

for(inti=0;i

適用范圍:適用于大多數(shù)要求不高的數(shù)據(jù)通訊。

應(yīng)用例子:ic卡接口通訊、很多單片機系統(tǒng)的串口通訊都使用。

4、LRC縱向冗余校驗(Longitudinal Redundancy Check)

實現(xiàn)方式:將ASCII碼幀中的頭和尾去掉,將串中的每個字節(jié)變成16進制相加,再講結(jié)果取反加1(補碼),就是VRC(vertical redundant code,垂直冗余碼)了。

應(yīng)用例子:在行列格式中(如磁帶)。

5、CRC(Cyclic Redundancy Check,循環(huán)冗余校驗)循環(huán)冗余校驗

它是利用除法及余數(shù)的原理來作錯誤偵測(Error Detecting)的。實際應(yīng)用時,發(fā)送裝置計算出CRC值并隨數(shù)據(jù)一同發(fā)送給接收裝置,接收裝置對收到的數(shù)據(jù)重新計算CRC并與收到的CRC相比較,若兩個CRC值不同,則說明數(shù)據(jù)通訊出現(xiàn)錯誤。

根據(jù)應(yīng)用環(huán)境與習慣的不同,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)設(shè)置CRC寄存器,并將其賦值位FFFF(HEX碼)。

(2)將數(shù)據(jù)的第一個8-bit字符與16位CRC寄存器的低8位進行異或,并將結(jié)果保存到CRC寄存器中。

(3)將CRC寄存器向右移1位,MSB(Most Significant Bit,最高有效位)補0,移出并檢查LSB(Lease

Significant Bit,最低有效位)。

(4)如果LSB為0,重復(fù) “第3步”。若LSB為1,CRC寄存器與多項式碼相抑或,

(5)重復(fù)?“第3步” 到 “第4步” 直到8次移位全部完成。此時一個9-bit數(shù)據(jù)處理完畢。

(6)重復(fù) “第2步” 到 “第5步” 直到所有數(shù)據(jù)全部處理完畢。

(7)最終CRC寄存器的值就是CRC的值了。

現(xiàn)在應(yīng)用最多的就是 CRC32 算法,它產(chǎn)生一個4字節(jié)(32位)的校驗值,一般是以8位十六進制數(shù),如FA 12 CD

45等。CRC算法的優(yōu)點在于簡便、速度快,嚴格的來說,CRC更應(yīng)該被稱為數(shù)據(jù)校驗算法,但其功能與數(shù)據(jù)摘要算法類似,因此也作為測試的可選算法。

在 WinRAR、WinZIP 等軟件中,也是以 CRC32 作為文件校驗算法的。一般常見的簡單文件校驗(Simple File Verify – SFV)也是以 CRC32算法為基礎(chǔ),它通過生成一個后綴名為 .SFV 的文本文件,這樣可以任何時候可以將文件內(nèi)容 CRC32運算的結(jié)果與 .SFV 文件中的值對比來確定此文件的完整性。

適用范圍:CRC-12碼通常用來傳送6-bit字符串;CRC-16及CRC-CCITT碼則用是來傳送8-bit字符。CRC-32:硬盤數(shù)據(jù),網(wǎng)絡(luò)傳輸?shù)取?/p>

應(yīng)用例子:rar 以及太網(wǎng)卡芯片、MPEG解碼芯片中

6、MD5、SHA、MAC等摘要算法

摘要算法用于數(shù)據(jù)量比較大的場合。它通過對所有數(shù)據(jù)提取指紋信息以實現(xiàn)數(shù)據(jù)簽名、數(shù)據(jù)完整性校驗等功能,由于其不可逆性,有時候會被用做敏感信息的加密。數(shù)據(jù)摘要算法也被稱為哈希(Hash)算法、散列算法。在互聯(lián)網(wǎng)上進行大文件傳輸時,都要得用MD5算法產(chǎn)生一個與文件匹配的、存儲MD5值的文本文件(后綴名為

.md5或.md5sum),這樣接收者在接收到文件后,就可以利用與 SFV

類似的方法來檢查文件完整性,絕大多數(shù)大型軟件公司或開源組織都是以這種方式來校驗數(shù)據(jù)完整性,而且部分操作系統(tǒng)也使用此算法來對用戶密碼進行加密,另外,它也是目前計算機犯罪中數(shù)據(jù)取證的最常用算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容