UART有一個(gè)奇偶校驗(yàn),CAN通信有CRC校驗(yàn)。Modbus、MAVlink、USB等通信協(xié)議也有校驗(yàn)信息。
在自定義數(shù)據(jù)存儲(chǔ)時(shí),有經(jīng)驗(yàn)的工程師都會(huì)添加一定校驗(yàn)信息。
你平時(shí)通信,或者數(shù)據(jù)存儲(chǔ)時(shí),你有用到校驗(yàn)信息嗎?下面就介紹幾種常見(jiàn)的校驗(yàn)算法。
校驗(yàn)和
校驗(yàn)和是最基本,也是嵌入式軟件工程師最常用的一種校驗(yàn)算法,其實(shí)現(xiàn)方法很簡(jiǎn)單,簡(jiǎn)單到只有幾行代碼。
實(shí)現(xiàn)的方式方法很多,不同的編程語(yǔ)言,不同的應(yīng)用有所不同,下面以C語(yǔ)言8位校驗(yàn)和為例:
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
異或校驗(yàn)
【異或校驗(yàn)】與【校驗(yàn)和】類似,對(duì)數(shù)據(jù)進(jìn)行“異或”,最終得到一個(gè)“異或值”。
uint8_t CheckXOR(uint8_t *Buf, uint8_t Len) { uint8_t i = 0; uint8_t x = 0; for(i=0; i校驗(yàn)和、異或校驗(yàn)的方式有很多種,比如有的還會(huì)傳入一個(gè)參數(shù)作為異或校驗(yàn)的值。
當(dāng)然,以上代碼僅供學(xué)習(xí)參考,實(shí)際應(yīng)用需結(jié)合項(xiàng)目情況修改代碼。CRC校驗(yàn)
CRC:Cyclic Redundancy Check,即循環(huán)冗余校驗(yàn)。
CRC是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
CRC校驗(yàn)屬于冗余校驗(yàn)中的一種,大學(xué)學(xué)計(jì)算機(jī)相關(guān)專業(yè)的同學(xué)都應(yīng)該學(xué)過(guò)CRC校驗(yàn)(學(xué)習(xí)時(shí)可能沒(méi)幾個(gè)同學(xué)搞明白了)
CRC有多種變體,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式領(lǐng)域,CRC-16用的比較多。
常見(jiàn)CRC參數(shù)模型:?
比如一種在單片機(jī)上實(shí)現(xiàn)CRC16的源碼: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; iCRC校驗(yàn)不同場(chǎng)景實(shí)現(xiàn)方式不同,網(wǎng)上也有很多公開(kāi)的庫(kù)和源碼,比如:
LibCRC – C語(yǔ)言中的開(kāi)源CRC庫(kù):
https://github.com/lammertb/libcrc
網(wǎng)上還有在線計(jì)算CRC校驗(yàn)值以及代碼生成工具,感興趣的讀者可以自行了解。MD5算法
? MD5:Message-Digest Algorithm 5,即“信息-摘要算法。
從名字來(lái)看就知道它是從MD3、MD4發(fā)展而來(lái)的一種加密算法,其主要通過(guò)采集文件的信息摘要,以此進(jìn)行計(jì)算并加密。
通過(guò)MD5算法進(jìn)行加密,文件就可以獲得一個(gè)唯一的MD5值,這個(gè)值是獨(dú)一無(wú)二的,就像我們的指紋一樣,因此我們就可以通過(guò)文件的MD5值來(lái)確定文件是否正確,密碼進(jìn)行加密后也會(huì)生成MD5值,論壇就是通過(guò)MD5值來(lái)驗(yàn)證用戶的密碼是否正確的。
MD5是輸入不定長(zhǎng)度信息,輸出固定長(zhǎng)度128-bits的算法。經(jīng)過(guò)程序流程,生成四個(gè)32位數(shù)據(jù),最后聯(lián)合起來(lái)成為一個(gè)128-bits散列?;痉绞綖椋笥?、取余、調(diào)整長(zhǎng)度、與鏈接變量進(jìn)行循環(huán)運(yùn)算。得出結(jié)果。
MD5的源碼在網(wǎng)上都能找到現(xiàn)成的,而且有不同編程語(yǔ)言(C、 C++、 JAVA)版本。
比如由網(wǎng)友talent518分享的C語(yǔ)言版本:
https://github.com/talent518/md5其他更多
隨著變成技術(shù)越來(lái)越發(fā)達(dá),校驗(yàn)算法也越來(lái)越多,有通用的算法,也有特殊領(lǐng)域特定的算法。
比如我之前做過(guò)密碼相關(guān)的開(kāi)發(fā),使用了由密碼管理局發(fā)布的SM3密碼雜湊算法。
還有從MD4算法改進(jìn)而來(lái)的SHA-1算法(Secure Hash Algorithm 1即安全散列算法1)。
本文就分享到這里,市面上的校驗(yàn)算法還有很多,如有需要可自行上網(wǎng)了解。
審核編輯:湯梓紅
-
CAN
+關(guān)注
關(guān)注
57文章
2772瀏覽量
464452 -
算法
+關(guān)注
關(guān)注
23文章
4631瀏覽量
93408 -
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29588 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137801 -
uart
+關(guān)注
關(guān)注
22文章
1244瀏覽量
101804
原文標(biāo)題:?jiǎn)纹瑱C(jī)中常用的輕量級(jí)校驗(yàn)算法
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
輕量級(jí)的ui框架如何去制作
常用的校驗(yàn)算法有哪些?
IP協(xié)議校驗(yàn)算法程序
LTE系統(tǒng)的CRC校驗(yàn)算法及DSP實(shí)現(xiàn)
如何使用SMART編寫CRC的校驗(yàn)算法程序
![如何使用SMART編寫CRC的<b class='flag-5'>校驗(yàn)算法</b>程序](https://file.elecfans.com/web1/M00/AB/4B/pIYBAF2xaAyATEgoAABolfp-7Ew448.png)
如何使用51單片機(jī)實(shí)現(xiàn)CRC校驗(yàn)算法
![如何使用51<b class='flag-5'>單片機(jī)</b>實(shí)現(xiàn)CRC<b class='flag-5'>校驗(yàn)算法</b>](https://file.elecfans.com/web1/M00/B1/27/o4YBAF34jq6AG_G5AAB9pp6ZRLM461.png)
原創(chuàng)分享:自制輕量級(jí)單片機(jī)UI框架
![原創(chuàng)分享:自制<b class='flag-5'>輕量級(jí)</b><b class='flag-5'>單片機(jī)</b>UI框架](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
針對(duì)單片機(jī)開(kāi)發(fā)的輕量級(jí)OTA組件
單片機(jī)中幾種常見(jiàn)的校驗(yàn)算法介紹
![<b class='flag-5'>單片機(jī)</b>中幾種常見(jiàn)的<b class='flag-5'>校驗(yàn)算法</b>介紹](https://file1.elecfans.com/web2/M00/89/34/wKgZomR9gJmAEAnDAAAu_rfjFW4574.png)
評(píng)論