4種常見的校驗算法

2021-02-14 嵌入式情報局

UART有一個奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協議也有校驗信息。在自定義數據存儲時,有經驗的工程師都會添加一定校驗信息。你平時通信,或者數據存儲時,你有用到校驗信息嗎?下面就介紹幾種常見的校驗算法。校驗和是最基本,也是嵌入式工程師最常用的一種校驗算法,其實現方法很簡單,簡單到只有幾行代碼。
實現的方式方法很多,不同的程式語言,不同的應用有所不同,下面以C語言8位校驗和為例:
uint8_t CheckSum(uint8_t *Buf, uint8_t Len){  uint8_t i = 0;  uint8_t sum = 0;  uint8_t checksum = 0;
for(i=0; i<Len; i++) { sum += *Buf++; }
checksum = sum & 0xff;
return checksum;}

【異或校驗】與【校驗和】類似,對數據進行「異或」,最終得到一個「異或值」。
uint8_t CheckXOR(uint8_t *Buf, uint8_t Len){  uint8_t i = 0;  uint8_t x = 0;
for(i=0; i<Len; i++) { x = x^(*(Buf+i)); }
return x;}

校驗和、異或校驗的方式有很多種,比如有的還會傳入一個參數作為異或校驗的值。當然,以上代碼僅供學習參考,實際應用需結合項目情況修改代碼。
CRC:Cyclic Redundancy Check,即循環冗餘校驗。CRC是數據通信領域中最常用的一種查錯校驗碼,其特徵是信息欄位和校驗欄位的長度可以任意選定。循環冗餘檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的後面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。(來自網絡)CRC校驗屬於冗餘校驗中的一種,大學學計算機相關專業的同學都應該學過CRC校驗(學習時可能沒幾個同學搞明白了)CRC有多種變體,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式領域,CRC-16用的比較多。
uint8_t CRCTAB_H[256] = {};uint8_t CRCTAB_L[256] = {};void CRC16(uint8_t *pData, uint8_t Len, uint8_t *CRC_H, uint8_t *CRC_L){  uint8_t  i;  uint8_t  index;  uint8_t  crc_h = 0xFF;  uint8_t  crc_l = 0xFF;
for(i=0; i<Len; i++) { index = crc_h^*(pData + i); crc_h = crc_l^CRCTAB_H[index]; crc_l = CRCTAB_L[index]; }
*CRC_H = crc_h; *CRC_L = crc_l;}

CRC校驗不同場景實現方式不同,網上也有很多公開的庫和源碼,比如:
https://github.com/lammertb/libcrc
網上還有在線計算CRC校驗值以及代碼生成工具,感興趣的讀者可以自行了解。
MD5:Message-Digest Algorithm 5,即「信息-摘要算法。從名字來看就知道它是從MD3、MD4發展而來的一種加密算法,其主要通過採集文件的信息摘要,以此進行計算並加密。通過MD5算法進行加密,文件就可以獲得一個唯一的MD5值,這個值是獨一無二的,就像我們的指紋一樣,因此我們就可以通過文件的MD5值來確定文件是否正確,密碼進行加密後也會生成MD5值,論壇就是通過MD5值來驗證用戶的密碼是否正確的。MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經過程序流程,生成四個32位數據,最後聯合起來成為一個128-bits散列。基本方式為,求餘、取餘、調整長度、與連結變量進行循環運算。得出結果。MD5的源碼在網上都能找到現成的,而且有不同程式語言(C、 C++、 JAVA)版本。https://github.com/talent518/md5隨著變成技術越來越發達,校驗算法也越來越多,有通用的算法,也有特殊領域特定的算法。比如我之前做過密碼相關的開發,使用了由密碼管理局發布的SM3密碼雜湊算法。還有從MD4算法改進而來的SHA-1算法(Secure Hash Algorithm 1即安全散列算法1)。本文就分享到這裡,市面上的校驗算法還有很多,如有需要可進一步了解。版權歸原作者所有,如有侵權,請聯繫小哥刪除,感謝。

相關焦點

  • 幾種常見的校驗算法
    在自定義數據存儲時,有經驗的工程師都會添加一定校驗信息。你平時通信,或者數據存儲時,你有用到校驗信息嗎?下面就介紹幾種常見的校驗算法。一、校驗和校驗和是最基本,也是嵌入式工程師最常用的一種校驗算法,其實現方法很簡單,簡單到只有幾行代碼。
  • CRC 循環冗餘校驗算法
    另外,每傳輸一個字節都要附加一位校驗位,對傳輸效率的影響很大。因此,在高速數據通訊中很少採用奇偶校驗。奇偶校驗優點也很明顯,它很簡單,因此可以用硬體來實現,這樣可以減少軟體的負擔。因此,奇偶校驗也被廣泛的應用著。累加和校驗另一種常見的校驗方式是累加和校驗。
  • 常用的CRC 循環冗餘校驗算法
    另外,每傳輸一個字節都要附加一位校驗位,對傳輸效率的影響很大。因此,在高速數據通訊中很少採用奇偶校驗。奇偶校驗優點也很明顯,它很簡單,因此可以用硬體來實現,這樣可以減少軟體的負擔。因此,奇偶校驗也被廣泛的應用著。累加和校驗另一種常見的校驗方式是累加和校驗。所謂累加和校驗實現方式有很多種,最常用的一種是在一次通訊數據包的最後加入一個字節的校驗數據。
  • 數據校驗及常用校驗算法概述
    1、數據校驗過程 由於數據傳輸距離的因素影響,計算機和受控設備間的通信數據就常常出現不可預知的錯誤。為了防止這些錯誤所帶來的影響,一般在通信時採取數據校驗方法,而奇偶校驗和循環冗餘碼校驗就是其中最常用的校驗算法。串行數據在傳輸過程中,由於幹擾可能引起信息的錯誤,出現「誤碼」。
  • 詳解LIN通訊和CAN通訊的校驗算法
    在前一段時間推送的幾篇文章中涉及到了幾種不同的通訊方式,在每一個通訊方式講解時都有提到校驗,而且每一種通訊中的校驗也是不盡相同的,今天小編就和大家一起看一看這些檢驗到底是怎麼回事。而其應用又和協議的版本以及通訊的類型有關,LIN2.0以前通訊幀和診斷幀都是使用經典型校驗,LIN2.0以及LIN2.0以後通訊幀使用的是增強型校驗,而診斷幀還是使用的經典型校驗,用一個表格來表示如下兩種校驗類型的計算01經典型校驗經典型校驗算法涵蓋的範圍只有LIN的數據段,即一幀LIN信號的數據段包含幾個字節的數據就計算幾個字節,計算的時候是累加計算
  • 嵌入式程式設計師的循環冗餘校驗(CRC)算法最簡單入門
    CRC 算法的基本思想是將傳輸的數據當做一個位數很長的數。將這個數除以另一個數。得到的餘數作為校驗數據附加到原數據後面。還以上面例子中的數據為例:6、23、4 可以看做一個2進位數: 0000011000010111 00000010假如被除數選9,二進位表示為:1001則除法運算可以表示為:可以看到,最後的餘數為1。
  • 計算機常用的數據信息校驗方式—奇偶校驗、漢明校驗和CRC校驗
    數據校驗碼的實現原理:在對數據進行編碼傳輸時,除了對信息數據外,再加入一位或者幾位二進位位作為校驗位,經過一系列的合理安排的校驗位,使用合適的編碼規則算法,就能達到對傳輸數據的校驗功能,實驗數據的檢錯和糾錯功能。
  • 常見 Hash 算法的原理
    了解了hash基本定義,就不能不提到一些著名的hash算法,MD5 和 SHA-1 能夠說是眼下應用最廣泛的Hash算法,而它們都是以 MD4 為基礎設計的。那麼他們都是什麼意思呢?這裡簡單說一下:(1) MD4MD4(RFC 1320)是 MIT 的 Ronald L.
  • 什麼是哈希算法
    哈希函數的最常見的一個作用就是進行完整性校驗( Integrity Check ),完整的意思是數據無損壞。哈希有很多不同的稱呼,有時候叫 Digest 摘要,有時候叫 Checksum 校驗值,有時候叫 Fingerprint 指紋,其實說的意思差不多,也就是說哈希可以用來代表數據本身。
  • CRC校驗你會嗎?計算、校驗、C語言實現,三步教你輕鬆搞定
    接收方接收到數據時,採用同樣的校驗算法對原始數據進行計算,如果計算結果和接收到的校驗值一致,說明數據校驗正確,這一幀數據可以使用,如果不一致,說明傳輸過程中出現了差錯,這一幀數據丟棄,請求重發。常用的校驗算法有奇偶校驗、校驗和、CRC,還有LRC、BCC等不常用的校驗算法。以串口通訊中的奇校驗為例,如果數據中1的個數為奇數,則奇校驗位0,否則為1。
  • 14種機器學習常見算法分類匯總!
    在機器學習或者人工智慧領域,人們首先會考慮算法的學習方式。在機器學習領域,有幾種主要的學習方式。將算法按照學習方式分類是一個不錯的想法,這樣可以讓人們在建模和算法選擇的時候考慮能根據輸入數據來選擇最合適的算法來獲得最好的結果。
  • java最常用的幾種加密算法
    BASE64Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用於在HTTP環境下傳遞較長的標識信息。
  • 機器學習中常見4種學習方法、13種算法和27張速查表
    很多時候困惑人們都是,很多算法是一類算法,而有些算法又是從其他算法中延伸出來的。這裡,我們從兩個方面來給大家介紹,第一個方面是學習的方式,第二個方面是算法的分類。一、4大主要學習方式1.監督式學習 常見的應用場景包括關聯規則的學習以及聚類等。常見算法包括Apriori算法以及k-Means算法。4.半監督式學習
  • 幾種常見溫度控制算法
    今天就給大家分享一下溫控儀中幾種常見的溫度控制算法。常用PID調節器/溫控儀控制算法包括常規PID、模糊控制、神經網絡、Fuzzy-PID、神經網絡PID、模糊神經網絡、遺傳PID及廣義預測等算法。故對幾種常見的控制方法及其優缺點進行了分析與比較。1.常規PID控制明顯缺點是現場PID參數整定麻煩,易受外界幹擾,對於滯後大的過程控制,調節時間過長。其控制算法需要預先建立模型,對系統動態特性的影響很難歸併到模型中。在我國大多數PID調節器廠家生產的調節器均為常規PID控制算法。
  • 理解數字籤名、加密通信的關鍵:哈希算法
    不同的哈希算法,哈希位數越多,也就基本意味著安全級別越高,或者說它的」抗碰撞性「就越好。  再來說說哈希函數的主要作用。哈希的獨一無二性,保證了如果數據在存儲或者傳輸過程中有絲毫損壞,那麼它的哈希就會變。哈希函數的最常見的一個作用就是進行完整性校驗( Integrity Check ),完整的意思是數據無損壞。
  • STM32中CRC計算單元,及CRC校驗的應用
    作者:strongerHuangCRC校驗算應該絕大部分理工類同學都學習過,但真正搞明白的沒幾個,之前給大家分享過《幾種常見的校驗算法
  • 8種常見機器學習算法比較
    ,文中主要介紹了8種計算機算法及其優缺點,為大家進行算法選擇時提供一點意見。偏差和方差與模型複雜度的關係使用下圖更加明了:           當模型複雜度上升的時候,偏差會逐漸變小,而方差會逐漸變大。
  • 一分鐘學會銀行卡號的規則及校驗方法
    縮寫為MII),分配如下:- 0 - ISO/TC 68和其他行業分配- 1 - 航空業- 2 - 航空業,金融業和其他未來行業分配- 3- 旅遊業和娛樂業- 4Luhn算法,也稱為「模10」算法,是一種簡單的校驗和(Checksum)算法,一般用於驗證身份識別號碼,例如信用卡號碼、國際行動裝置識別碼(International Mobile Equipment Identity,縮寫為IMEI),美國供應商識別號碼,加拿大社會保險號碼,以色列身份證號碼,希臘社會安全號碼等。
  • 5G通信算法:LDPC解碼算法詳解
    LDPC硬判決解碼算法主要分為:消息傳遞(Message-Passing,MP)算法、比特翻轉(Bit Flipping, BF)算法和Gallager A、B算法。比特翻轉算法中,先求取HCT,如果為0則停止解碼,否則翻轉參與校驗失敗校驗方程最多的變量節點對應的比特,再計算HCT,如此迭代直到HCT=0或達到設定迭代次數。
  • 機器學習常見算法分類匯總
    很多人在平時的工作中都或多或少會用到機器學習的算法。這裡總結一下常見的機器學習算法,以供您在工作和學習中參考。機器學習的算法很多。很多時候困惑人們都是,很多算法是一類算法,而有些算法又是從其他算法中延伸出來的。這裡,我們從兩個方面來給大家介紹,第一個方面是學習的方式,第二個方面是算法的類似性。