累加和校驗演算法 CheckSum演算法

2021-09-13 10:08:24 字數 827 閱讀 9702

因為外界總會對電路存在或多或少的干擾,對於數碼訊號,很可能導致傳輸的資料出現千差萬別。對於很多需要傳輸資料的場合,尤其是一些資料可能會影響一些硬體的動作(諸如嵌入式的一些裝置、機械人等),錯誤的資料可能會帶來一些隱性風險

今日主角:累加和校驗演算法,又名checksum演算法

這種演算法的實現:

傳送方:對資料累加,得到乙個資料和,對和求反,即得到我們的校驗值。然後把要發的資料和這個校驗值一起傳送給接收方。

接收方:對接收的資料(包括校驗和)進行累加,然後加1,如果得到0,那麼說明資料沒有出現傳輸錯誤。(注意,此處傳送方和接收方用於儲存累加結果的型別一定要一致,否則加1就無法實現溢位從而無法得到0,校驗就會無效)

還是舉個例子:

傳送方:要傳送0xa8,0x50,我們使用unsigned char(8位)來儲存累加和,即為0xf8(11111000),取反得到校驗和為0x07(00000111)。然後將這三個資料傳送出去。

接收方:如果接收正確,這三個資料的累加和就是(11111111),此時加1,則得到的結果為0(實際得到的應該是100000000,但是由於是使用unsigned char(8位)來儲存累加和,所以高位被擷取掉,只剩下了低八位的8個0).

由上面的例子,我們可以知道演算法的目的是:使累加和和校驗值相加得到乙個二進位制下每一位都是1的結果,這個結果很明顯很好處理,這種演算法實現起來也很簡單,下面給出c語言的**示例。

傳送方:以下是如何得到校驗值的**,結果就是我們想要的校驗值。

u8 tx_checksum(u8 *buf, u8 len) //buf為陣列,len為陣列長度

ret = ret;

return ret+1;

}

累加和校驗演算法在嵌入式中的應用

因為外界總會對電路存在或多或少的干擾,對於數碼訊號,很可能導致傳輸的資料出現千差萬別。對於很多需要傳輸資料的場合,尤其是一些資料可能會影響一些硬體的動作 諸如嵌入式的一些裝置 機械人等 錯誤的資料可能會帶來一些隱性風險,想想都可怕。由於本人是嵌入式相關領域的,平時玩的都是微控制器,當然微控制器的效能...

直觀對比 奇偶校驗 累加和校驗 CRC校驗

奇偶校驗 所謂通訊過程的校驗是指在通訊資料後加上一些附加資訊,通過這些附加資訊來判斷接收到的資料是否和傳送出的資料相同。比如說rs232 序列通訊可以設定奇偶校驗位,所謂奇偶校驗就是在傳送的每乙個位元組後都加上一位,使得每個位元組中1的個數為奇數個或偶數個。比如我們要 傳送的位元組是0x1a,二進位...

TCP UDP 校驗演算法

經常看計算機網路相關的書時,每次看到關於ip或者是udp報頭校驗和時,都是一笑而過,以為相當簡單的東西,不就是16bit資料的相加嗎!最近在學習ping命令的源待時,看到裡面有關於校驗和的演算法。一頭霧水,後來查詢資料,看到校驗和是16bit字的二進位制反碼和。總是覺得很奇怪,為什麼會用反碼和,而不...