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)。本文就分享到這裡,市面上的校驗算法還有很多,如有需要可進一步了解。版權歸原作者所有,如有侵權,請聯繫小哥刪除,感謝。