VC串列埠程式設計基礎 各種資料校驗方法

2021-06-27 03:46:22 字數 2152 閱讀 8903

最近接觸了藍芽通訊,用安卓上位機連線藍芽模組進行通訊,被裡面的乙個校驗方法給卡住了,花了兩個星期還沒有解決,為此我專門查了各種比較常用的資料校驗方式,藉以擴充自己的知識面啊~~~~

下面介紹了資料通訊中常用的幾種資料校驗方法,對於vc

串列埠程式設計人員來說非常有必要了解,而且還得掌握其中一到兩種校驗方法,本文只講解了種中資料校驗的基本概念,以後vc

串列埠通訊技術網會針對種校驗方法發表詳細的言說闡述這些方法的原理。

什麼是資料校驗

通俗的說,就是為保證資料的完整性,用一種指定的演算法對原始資料計算出的乙個校驗值。接收方用同樣的演算法計算一次校驗值,如果和隨資料提供的校驗值一樣,就說明資料是完整的。

最簡單的檢驗

實現方法:最簡單的校驗就是把原始資料和待比較資料直接進行比較,看是否完全一樣這種方法是最安全最準確的。同時也是效率最低的。

適用範圍:簡單的資料量極小的通訊。

應用例子:龍珠

cpubbug.exe

。它和龍珠

cpu間通訊時,

bbug

傳送乙個位元組

cpu返**到的位元組,

bbug

確認是剛才傳送位元組後才繼續傳送下乙個位元組的。

奇偶校驗

parity check

實現方法:在資料儲存和傳輸中,位元組中額外增加乙個位元位,用來檢驗錯誤。校驗位可以通過資料位異或計算出來。

應用例子:微控制器串列埠通訊有一模式就是

8位資料通訊,另加第

9位用於放校驗值。

bcc

異或校驗法

(block check character)

實現方法:很多基於串列埠的通訊都用這種既簡單又相當準確的方法。它就是把所有資料都和乙個指定的初始值(通常是

0)異或一次,最後的結果就是校驗值,通常把她附在通訊資料的最後一起傳送出去。接收方收到資料後自己也計算一次異或和校驗值,如果和收到的校驗值一致就說明收到的資料是完整的。

校驗值計算的**類似於:

unsigned ucrc=0;//

校驗初始值

for(int i=0;i

適用範圍:適用於大多數要求不高的資料通訊。

應用例子:

ic卡介面通訊、很多微控制器系統的串列埠通訊都使用。

crc

迴圈冗餘校驗

(cyclic redundancy check)

實現方法:這是利用除法及餘數的原理來進行錯誤檢測的

.將接收到的碼組進行除法運算,如果除盡,則說明傳輸無誤;如果未除盡,則表明傳輸出現差錯。

crc校驗具還有自動糾錯能力。

crc檢驗主要有計算法和查表法兩種方法,網上很多實現**。

適用範圍:

crc-12

碼通常用來傳送

6-bit

字串;crc-16

及crc-ccitt

碼則用是來傳送

8-bit

字元。crc-32

:硬碟資料,網路傳輸等

應用例子:

rar,

乙太網卡晶元、

mpeg

解碼晶元中

md5

校驗和數字簽名

實現方法:主要有

md5和

des演算法。

適用範圍:資料比較大或要求比較高的場合。如

md5用於大量資料、檔案校驗,

des用於保密資料的校驗(數字簽名)等等。

應用例子:檔案校驗、銀行系統的交易資料

資料校驗的乙個實際應用

防止自己的程式被篡改的例子。有些可執行程式,當被改了資源時再執行會有檔案已損壞的提示,這就是使用了資料校驗。本例是用

md5做為資料校驗的演算法。當然你可以使用個性化的比如

des作為數字簽名,那樣安全性更高。編譯時,將提示如圖

1的資訊,請記下上面的數值,然後寫回程式的比較字元

中。再次編譯就不會提示了,直接進入程式。如果你使用

pe資源修改器修改改該

exe檔案了資源,再執行又會出現圖

1的提示。具體請見**及注釋。

上位機串列埠資料檢驗方式(二) 奇偶校驗

奇偶校驗這個概念在邏輯設計裡面經常會用到,但有的人對奇偶校驗的理解很混亂。奇偶校驗是對資料傳輸正確性的一種校驗方法。在資料傳輸前附加一位奇校驗位,用來表示傳輸的資料中 1 的個數是奇數還是偶數,為奇數時,校驗位置為 0 否則置為 1 用以保持資料的奇偶性不變。1.奇校驗 1 資料位中 1 的數目是偶...

VC 6 0與各種資料庫的連線

這是本人經過親自測試的,絕對可用,效果怎麼樣就不好說了,因為正在學習中,所以都是用的最簡單的,沒有複雜的功能,都只有一條寫入語句來試驗是否成功。在odbc中設定資料來源,名稱為studb 登陸使用者名稱z 登陸密碼111111 第一步 在stdafx.h標頭檔案中加入如下 import c prog...

C 基礎學習 函式與各種資料結構

int sum arr int arr,int n 在c 中當且僅當用於函式頭或函式原型的時候,int arr 和 int arr的含義是一樣的 可以修改陣列內容 void fmodify int arr,int n 不可以修改陣列內容 void nochange const int arr,int...