0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【C語(yǔ)言應(yīng)用】使用查表法計(jì)算CRC8

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-08-31 12:54 ? 次閱讀

筆者曾經(jīng)在一個(gè)項(xiàng)目中,有一個(gè)數(shù)據(jù)協(xié)議對(duì)接需要用到簡(jiǎn)單的CRC8校驗(yàn)。當(dāng)初我們實(shí)現(xiàn)的方法是使用查表法,現(xiàn)將實(shí)現(xiàn)代碼分享下。

//CRC8查表法  
static uint8_t R_CRCTABLE[] =  //reversed, 8-bit, poly=0x07 
{ 
    0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 
    0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B, 
    0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 
    0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67, 
    0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 
    0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43, 
    0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 
    0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F, 
    0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 
    0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B, 
    0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 
    0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17, 
    0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 
    0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33, 
    0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 
    0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F, 
    0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 
    0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B, 
    0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 
    0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87, 
    0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 
    0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3, 
    0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 
    0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF, 
    0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 
    0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB, 
    0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 
    0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7, 
    0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 
    0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3, 
    0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 
    0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF,
};

/**
 * copy from java code, warning "unsigned char" and "char"
 * 計(jì)算input的CRC
 * @param input
 * @return 返回CRC值
 */
uint8_t get_crc8(const void *Buf, uint32_t Len)
{
    uint8_t *input = (uint8_t*)Buf;
    uint8_t fcs = (uint8_t)0xFF;
    int32_t i;
    for (i = 0; i < (int32_t)Len; i++)
        fcs = R_CRCTABLE[fcs ^ (uint8_t)input[i]];

    return (uint8_t) (0xFF - fcs);
}

該段代碼是成熟的代碼,不過(guò)值得注意的是,像這種需要兩邊對(duì)等校驗(yàn)數(shù)據(jù)的通訊,在代碼實(shí)現(xiàn)時(shí),最好兩邊都使用相同實(shí)現(xiàn)的校驗(yàn)代碼,保證不會(huì)因?yàn)樾r?yàn)算法的實(shí)現(xiàn)不同,而出現(xiàn)相同報(bào)文卻計(jì)算出不同校驗(yàn)值的情況。

在使用場(chǎng)景上,CRC8一般用于對(duì)數(shù)據(jù)校驗(yàn)不是那么嚴(yán)格的場(chǎng)景,畢竟單用1個(gè)字節(jié)做校驗(yàn),很多時(shí)候可能會(huì)產(chǎn)生誤判。所以,如果對(duì)數(shù)據(jù)校驗(yàn)要求更高時(shí),需要使用其他更高級(jí)的數(shù)據(jù)校驗(yàn)方法。


延伸閱讀:

C語(yǔ)言】使用余式表的方式計(jì)算CRC16


架構(gòu)師李肯

架構(gòu)師李肯全網(wǎng)同名),一個(gè)專(zhuān)注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線(xiàn)開(kāi)發(fā)經(jīng)驗(yàn),深耕IoT領(lǐng)域多年,熟知IoT領(lǐng)域的業(yè)務(wù)發(fā)展,深度掌握IoT領(lǐng)域的相關(guān)技術(shù)棧,包括但不限于主流RTOS內(nèi)核的實(shí)現(xiàn)及其移植、硬件驅(qū)動(dòng)移植開(kāi)發(fā)、網(wǎng)絡(luò)通訊協(xié)議開(kāi)發(fā)、編譯構(gòu)建原理及其實(shí)現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺(tái)的對(duì)接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計(jì)等等。擁有多項(xiàng)IoT領(lǐng)域的發(fā)明專(zhuān)利,熱衷于技術(shù)分享,有多年撰寫(xiě)技術(shù)博客的經(jīng)驗(yàn)積累,連續(xù)多月獲得RT-Thread官方技術(shù)社區(qū)原創(chuàng)技術(shù)博文優(yōu)秀獎(jiǎng),榮獲CSDN博客專(zhuān)家、CSDN物聯(lián)網(wǎng)領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、2021年度CSDN&RT-Thread技術(shù)社區(qū)之星、2022年RT-Thread全球技術(shù)大會(huì)講師、RT-Thread官方嵌入式開(kāi)源社區(qū)認(rèn)證專(zhuān)家、RT-Thread 2021年度論壇之星TOP4、華為云云享專(zhuān)家(嵌入式物聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)師)等榮譽(yù)。堅(jiān)信【知識(shí)改變命運(yùn),技術(shù)改變世界】!


歡迎關(guān)注我的gitee倉(cāng)庫(kù)01workstation ,日常分享一些開(kāi)發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問(wèn)題。

同時(shí)也非常歡迎關(guān)注我的CSDN主頁(yè)和專(zhuān)欄:

【CSDN主頁(yè)-架構(gòu)師李肯】

【RT-Thread主頁(yè)-架構(gòu)師李肯】

【C/C++語(yǔ)言編程專(zhuān)欄】

【GCC專(zhuān)欄】

信息安全專(zhuān)欄】

【RT-Thread開(kāi)發(fā)筆記】

freeRTOS開(kāi)發(fā)筆記】

有問(wèn)題的話(huà),可以跟我討論,知無(wú)不答,謝謝大家。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135887
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68240
  • CRC8
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6154
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從原理到代碼理解CRC循環(huán)冗余校驗(yàn)

    本文詳細(xì)介紹了CRC循環(huán)冗余計(jì)算的數(shù)學(xué)原理,算法中使用的參數(shù)說(shuō)明,并以Modbus協(xié)議中的CRC-16算法為例,進(jìn)行手算驗(yàn)證,同時(shí)提供LabVIEW和C
    的頭像 發(fā)表于 01-29 09:00 ?1996次閱讀
    從原理到代碼理解<b class='flag-5'>CRC</b>循環(huán)冗余校驗(yàn)

    TAS5805內(nèi)部的硬件CRC8對(duì)應(yīng)標(biāo)準(zhǔn)的哪種? CRC校驗(yàn)的數(shù)據(jù)是offset和value值嗎?

    TAS5805 內(nèi)部的硬件 CRC8 對(duì)應(yīng)標(biāo)準(zhǔn)的哪種? CRC 校驗(yàn)的數(shù)據(jù)是 offset 和 value 值嗎?用 PPC 加載文件計(jì)算出來(lái)的值和在線(xiàn)CRC
    發(fā)表于 10-12 06:19

    基于查表的快速CRC算法設(shè)計(jì)

    基于查表的快速CRC算法設(shè)計(jì)
    發(fā)表于 08-20 20:01

    Labview編寫(xiě)的CRC8校驗(yàn)程序

    用Labview編寫(xiě)的CRC8校驗(yàn)程序,輸入碼字序列后生成校驗(yàn)碼,通過(guò)閱讀此程序,用戶(hù)可采用類(lèi)似方式編寫(xiě)CRC16,CRC32的程序。
    發(fā)表于 10-22 21:13

    LabVIEW串口通信時(shí),用CRC8校驗(yàn)該怎么寫(xiě)

    串口通信時(shí),用CRC8校驗(yàn),跪求該種怎么寫(xiě)例如FF 0A 02 00 07 3F它的CRC8校驗(yàn)碼為7D
    發(fā)表于 05-05 14:25

    CRC16和CRC8校驗(yàn)計(jì)算,已經(jīng)驗(yàn)證算法正確

    本帖最后由 幸福牛寶兒 于 2016-10-31 14:33 編輯 用Labview2014做的CRC16和CRC8計(jì)算,已經(jīng)驗(yàn)證,計(jì)算結(jié)果正確。
    發(fā)表于 10-28 12:02

    CRYPTO中的CRC16計(jì)算結(jié)果有問(wèn)題怎么解決

    cubeMX只啟用CRC功能,其余默認(rèn)配置,編譯沒(méi)有任何問(wèn)題。調(diào)用參考官方例程,CRC32的計(jì)算結(jié)果沒(méi)問(wèn)題,嘗試CRC16、CRC8,
    發(fā)表于 08-18 09:43

    有沒(méi)有人可以幫助我正確的用python實(shí)現(xiàn)CRC8

    我對(duì)嵌入式編程很陌生。我必須用 HAL 實(shí)現(xiàn) CRC8,并嘗試在另一端用 python 實(shí)現(xiàn) CRC8。使用了 crc8 庫(kù),但兩個(gè)結(jié)果不匹配。有沒(méi)有人可以幫助我正確實(shí)施它?
    發(fā)表于 12-08 06:14

    如何將CRC配置為ITU-T CRC8呢?

    在 SUBGHZ 通用包 FSK 中,如何將 CRC 配置為 ITU-T CRC8:X8+X2+X+1我找到的唯一信息是在 Semtech SX1261/2 的數(shù)據(jù)表中,它只是關(guān)于 IBM C
    發(fā)表于 12-09 08:39

    Datasheet中BE13(SC900719) 的CRC8非常模糊怎么處理???

    Datasheet 中BE13(SC900719) 的 CRC8非常模糊。我試過(guò)很多次但都失敗了。 你能告訴我更多嗎? 給我一個(gè)正確的例子。
    發(fā)表于 04-25 09:09

    CRC算法原理及C語(yǔ)言實(shí)現(xiàn)

    CRC算法原理及C語(yǔ)言實(shí)現(xiàn):本文從理論上推導(dǎo)出CRC 算法實(shí)現(xiàn)原理,給出三種分別適應(yīng)不同計(jì)算機(jī)或微控制器硬件環(huán)境的
    發(fā)表于 09-23 23:38 ?31次下載

    CRC(查表)-表的由來(lái)

    利用查表實(shí)現(xiàn)CRC算法,CRC算法廣泛應(yīng)用與各行業(yè),查表實(shí)現(xiàn)
    發(fā)表于 01-06 11:29 ?15次下載

    labview的CRC8校驗(yàn)的詳細(xì)資料免費(fèi)下載

    該vi用公式節(jié)點(diǎn)導(dǎo)入CRC8校驗(yàn)的C程序,計(jì)算結(jié)果為一個(gè)CRC碼。 LabVIEW是一種程序開(kāi)發(fā)環(huán)境,由美國(guó)國(guó)家儀器(NI)公司研制開(kāi)發(fā),類(lèi)似于C
    發(fā)表于 08-13 08:00 ?176次下載
    labview的<b class='flag-5'>CRC8</b>校驗(yàn)的詳細(xì)資料免費(fèi)下載

    C語(yǔ)言應(yīng)用】使用余式表的方式計(jì)算CRC16

    C語(yǔ)言應(yīng)用】使用余式表的方式計(jì)算CRC16
    的頭像 發(fā)表于 08-31 13:10 ?1824次閱讀

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?823次閱讀