今天和客戶談技術(shù)需求的時候,談到了數(shù)據(jù)的有效性,客戶要求任何寫參數(shù)的數(shù)據(jù)都必須進(jìn)行校驗,校驗算法可以自定義、也可以遵循常用的算法。校驗的目的,是為了防止誤操作時刻保證數(shù)據(jù)的有效性。今天和大家分享一下幾種常用的校驗算法。
我聽見海浪的聲音,站在城市的最中央,我想起眼淚的決心。。。
UART有奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協(xié)議也有校驗信息。
在自定義數(shù)據(jù)存儲時,有經(jīng)驗的工程師都會添加一定校驗信息。
通信,或者數(shù)據(jù)存儲時,你有用到校驗信息嗎?
下面就介紹幾種常見的校驗算法。
校驗和是最基本,也是嵌入式工程師最常用的一種校驗算法,其實現(xiàn)方法很簡單,簡單到只有幾行代碼。
實現(xiàn)的方式方法很多,不同的編程語言,不同的應(yīng)用有所不同,下面以C語言八位校驗和為例:
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
{
sum += *Buf++;
??}
??checksum?=?sum?&?0xff;
return checksum;
}
校驗和的思想就是將數(shù)據(jù)相加,最后取低八位,程序中與0xff做“&“運(yùn)算,就是把低位保留下來。
”
異或校驗
“
與”校驗和“類似,對數(shù)據(jù)進(jìn)行“異或”,最終得到一個“異或值”。
uint8_t CheckXOR(uint8_t *Buf, uint8_t Len)
{
uint8_t i = 0;
uint8_t?x?=?0;
for(i=0; i
{
x = x^(*(Buf+i));
??}
return x;
}
校驗和、異或校驗的方式有很多種,比如有的還會傳入一個參數(shù)作為異或校驗的值。
當(dāng)然,以上代碼僅供學(xué)習(xí)參考,實際應(yīng)用需結(jié)合項目情況修改代碼。
CRC即所謂的循環(huán)冗余校驗,全稱為Cyclic Redundancy Check。
CRC是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)進(jìn)行多項式計算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
CRC有多種變體,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式領(lǐng)域,CRC-16用的比較多。
比如一種在單片機(jī)上實現(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; 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;
}
網(wǎng)上還有在線計算CRC校驗值以及代碼生成工具,感興趣的讀者可以自行了解。
MD5,
即信息-摘要算法,全稱為
Message-Digest Algorithm 5
。
從名字來看就知道它是從MD3、MD4發(fā)展而來的一種加密算法,其主要通過采集文件的信息摘要,以此進(jìn)行計算并加密。
通過MD5算法進(jìn)行加密,文件就可以獲得一個唯一的MD5值,這個值是獨(dú)一無二的,就像我們的指紋一樣,因此我們就可以通過文件的MD5值來確定文件是否正確,密碼進(jìn)行加密后也會生成MD5值,論壇就是通過MD5值來驗證用戶的密碼是否正確的。
MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經(jīng)過程序流程,生成四個32位數(shù)據(jù),最后聯(lián)合起來成為一個128-bits散列?;痉绞綖椋笥?、取余、調(diào)整長度、與鏈接變量進(jìn)行循環(huán)運(yùn)算。得出結(jié)果。
MD5的源碼在網(wǎng)上都能找到現(xiàn)成的,而且有不同編程語言(C、 C++、 JAVA)版本。
本文就分享到這里,市面上的校驗算法還有很多,如有需要可進(jìn)一步了解。
關(guān)注微信公眾號『玩轉(zhuǎn)嵌入式』,后臺回復(fù)“128”獲取干貨資料匯總,回復(fù)“256”加入技術(shù)交流群。
|單片機(jī)的Bootloader,可以實現(xiàn)用戶輕松升級程序
|
|模塊化編程,是團(tuán)隊協(xié)作編程的前提
|
|
|零基礎(chǔ)如何學(xué)習(xí)單片機(jī),一位入門者的進(jìn)階路徑,可參考
|
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!