<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          嵌入式軟件常用的校驗算法

          共 2352字,需瀏覽 5分鐘

           ·

          2022-06-20 22:42

              關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容

          來源:網(wǎng)絡(luò)素材


          UART有一個奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協(xié)議也有校驗信息。


          在自定義數(shù)據(jù)存儲時,有經(jīng)驗的工程師都會添加一定校驗信息。


          你平時通信,或者數(shù)據(jù)存儲時,你有用到校驗信息嗎?下面就介紹幾種常見的校驗算法。


          技術(shù)讓夢想更偉大

          1

          校驗和
          校驗和是最基本,也是嵌入式軟件工程師最常用的一種校驗算法,其實現(xiàn)方法很簡單,簡單到只有幾行代碼。


          實現(xiàn)的方式方法很多,不同的編程語言,不同的應(yīng)用有所不同,下面以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;}


          技術(shù)讓夢想更偉大

          2

          異或校驗
          【異或校驗與【校驗和類似,對數(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<Len; i++) { x = x^(*(Buf+i)); }
          return x;}


          校驗和、異或校驗的方式有很多種,比如有的還會傳入一個參數(shù)作為異或校驗的值。


          當(dāng)然,以上代碼僅供學(xué)習(xí)參考,實際應(yīng)用需結(jié)合項目情況修改代碼。


          技術(shù)讓夢想更偉大

          3

          CRC校驗
          CRC:Cyclic Redundancy Check,即循環(huán)冗余校驗。

          CRC是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)進(jìn)行多項式計算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。(來自網(wǎng)絡(luò))


          CRC校驗屬于冗余校驗中的一種,大學(xué)學(xué)計算機(jī)相關(guān)專業(yè)的同學(xué)都應(yīng)該學(xué)過CRC校驗(學(xué)習(xí)時可能沒幾個同學(xué)搞明白了)


          CRC有多種變體,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式領(lǐng)域,CRC-16用的比較多。


          常見CRC參數(shù)模型:


          比如一種在單片機(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<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校驗不同場景實現(xiàn)方式不同,網(wǎng)上也有很多公開的庫和源碼,比如:

          LibCRC – C語言中的開源CRC庫:

          https://github.com/lammertb/libcrc


          網(wǎng)上還有在線計算CRC校驗值以及代碼生成工具,感興趣的讀者可以自行了解。

          技術(shù)讓夢想更偉大

          1

          MD5算法
          MD5:Message-Digest Algorithm 5,即“信息-摘要算法。

          從名字來看就知道它是從MD3、MD4發(fā)展而來的一種加密算法,其主要通過采集文件的信息摘要,以此進(jìn)行計算并加密。


          通過MD5算法進(jìn)行加密,文件就可以獲得一個唯一的MD5值,這個值是獨一無二的,就像我們的指紋一樣,因此我們就可以通過文件的MD5值來確定文件是否正確,密碼進(jìn)行加密后也會生成MD5值,論壇就是通過MD5值來驗證用戶的密碼是否正確的。

          MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經(jīng)過程序流程,生成四個32位數(shù)據(jù),最后聯(lián)合起來成為一個128-bits散列。基本方式為,求余、取余、調(diào)整長度、與鏈接變量進(jìn)行循環(huán)運算。得出結(jié)果。


          MD5的源碼在網(wǎng)上都能找到現(xiàn)成的,而且有不同編程語言(C、 C++、 JAVA)版本。


          比如由網(wǎng)友talent518分享的C語言版本:

          https://github.com/talent518/md5


          技術(shù)讓夢想更偉大

          5

          其他算法

          隨著變成技術(shù)越來越發(fā)達(dá),校驗算法也越來越多,有通用的算法,也有特殊領(lǐng)域特定的算法。


          比如我之前做過密碼相關(guān)的開發(fā),使用了由密碼管理局發(fā)布的SM3密碼雜湊算法


          還有從MD4算法改進(jìn)而來的SHA-1算法(Secure Hash Algorithm 1即安全散列算法1)。


          本文就分享到這里,市面上的校驗算法還有很多,如有需要可自行上網(wǎng)了解。


          版權(quán)聲明:本文來源網(wǎng)絡(luò),免費傳達(dá)知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進(jìn)行刪除。

          ????????????????  END  ???????????????

          關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品 久久久精品cos | 麻豆传媒兔子先生 | 神尾舞无码| 亚洲三级片无码高清 | 国产青青操视频 |