CRC原理簡介

最近剛好有時間氮惯,整理了一下關(guān)于CRC的資料绍刮,詳細(xì)對比了下程序的實(shí)現(xiàn)過程和原理,當(dāng)然语淘,高手都是不在意的诲宇。

本文主要介紹CRC的一些基礎(chǔ)知識,個人收獲是后面關(guān)于網(wǎng)上標(biāo)準(zhǔn)Demo程序的一些詳細(xì)解析惶翻。見下一篇http://www.reibang.com/p/c0d93c2e89ce

聲明:本文定義部分參考網(wǎng)上多處資料姑蓝,只是為了方便做個筆記,引用網(wǎng)文做一些更改吕粗,如有雷同纺荧,請私信說明并修改。

一颅筋、關(guān)于CRC的介紹

CRC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check):數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯校驗(yàn)碼宙暇,其信息字段和校驗(yàn)字段長度可以任意指定,但要求通信雙方定義的CRC標(biāo)準(zhǔn)一致议泵。

二客给、工作原理

對于工控領(lǐng)域,我們主要利用CRC校驗(yàn)來處理各種數(shù)據(jù)流的數(shù)據(jù)正確性校驗(yàn)肢簿。

CRC原理:在K位信息碼(目標(biāo)發(fā)送數(shù)據(jù))后再拼接R位校驗(yàn)碼靶剑,使整個編碼長度為N位,因此這種編碼也叫(N,K)碼池充。通俗的說桩引,就是在需要發(fā)送的信息后面附加一個數(shù)(即校驗(yàn)碼),生成一個新的發(fā)送數(shù)據(jù)發(fā)送給接收端收夸。這個數(shù)據(jù)要求能夠使生成的新數(shù)據(jù)被一個特定的數(shù)整除坑匠。這里的整除需要引入模 2除法的概念,附上百度百科關(guān)于模2計(jì)算的鏈接:

https://baike.baidu.com/item/模2運(yùn)算/18556715?fr=aladdin

那么卧惜,CRC校驗(yàn)的具體做法就是

(1)選定一個標(biāo)準(zhǔn)除數(shù)(K位二進(jìn)制數(shù)據(jù)串)

(2)在要發(fā)送的數(shù)據(jù)(m位)后面加上K-1位0厘灼,然后將這個新數(shù)(M+K-1位)以模2除法的方式除以上面這個標(biāo)準(zhǔn)除數(shù),所得到的余數(shù)也就是該數(shù)據(jù)的CRC校驗(yàn)碼(注:余數(shù)必須比除數(shù)少且只少一位咽瓷,不夠就補(bǔ)0)

(3)將這個校驗(yàn)碼附在原m位數(shù)據(jù)后面设凹,構(gòu)成新的M+K-1位數(shù)據(jù),發(fā)送給接收端茅姜。

(4)接收端將接收到的數(shù)據(jù)除以標(biāo)準(zhǔn)除數(shù)闪朱,如果余數(shù)為0則認(rèn)為數(shù)據(jù)正確。

注意:CRC校驗(yàn)中有兩個關(guān)鍵點(diǎn):一是要預(yù)先確定一個發(fā)送端和接收端都用來作為除數(shù)的二進(jìn)制比特串(或多項(xiàng)式);二是把原始幀與上面選定的除進(jìn)行二進(jìn)制除法運(yùn)算奋姿,計(jì)算出FCS锄开。前者可以隨機(jī)選擇,也可按國際上通行的標(biāo)準(zhǔn)選擇称诗,但最高位和最低位必須均為“1”

實(shí)例:對于數(shù)據(jù)10110011(16#B3)萍悴,以指定除數(shù)110011求它的CRC校驗(yàn)碼,其過程如下:

關(guān)于校驗(yàn)碼的計(jì)算(重點(diǎn)來了)

單純談CRC的模2除法其實(shí)并不困難寓免,但實(shí)際計(jì)算中經(jīng)常會遇到計(jì)算出來的結(jié)果和實(shí)際不一致的情況癣诱,這也是這幾天我在看的東西。

這里需要知道幾個組成部分或者說計(jì)算概念:多項(xiàng)式公式再榄、多項(xiàng)式簡記式狡刘、數(shù)據(jù)寬度、初始值困鸥、結(jié)果異或值嗅蔬、輸入值反轉(zhuǎn)、輸出值反轉(zhuǎn)疾就、參數(shù)模型澜术。

1、多項(xiàng)式公式

對于CRC標(biāo)準(zhǔn)除數(shù)猬腰,一般使用多項(xiàng)式(或二項(xiàng)式)公式表示鸟废,如上例中除數(shù)11011的二項(xiàng)式為G(X)=X4+X3+X+1,X的指數(shù)就代表了該bit位上的數(shù)據(jù)為1,(最低位為0)姑荷。這里特別注意一下位數(shù)問題盒延,除數(shù)的位數(shù)為二項(xiàng)式最高次冪+1(4+1=5),這個很重要鼠冕。

2添寺、多項(xiàng)式簡記式

通過對CRC的基本了解我們知道,多項(xiàng)式的首尾必定為1懈费,而這個1的位置在下一步計(jì)算一定為0计露,所以就把前面這個1給省略掉了,出現(xiàn)了一個叫簡記式的東西憎乙,如上例中除數(shù)11011的簡記式為1011票罐,很多看過CRC高級語言源碼的人會知道,對于CRC_16標(biāo)準(zhǔn)下G(X)=X16+X15+X2+1(16#18005)的poly值實(shí)際上是8005泞边,這里使用的就是簡記式该押。后面會對這個用法做一個說明。

3繁堡、數(shù)據(jù)寬度

數(shù)據(jù)寬度指的就是CRC校驗(yàn)碼的長度(二進(jìn)制位數(shù))沈善,知道了CRC的運(yùn)算概念和多項(xiàng)式乡数,就可以理解這個概念了椭蹄,CRC長度始終要比除數(shù)位數(shù)少1闻牡,與簡記式長度是一致的。

以上三個數(shù)據(jù)就是我們經(jīng)常能夠用到的基本數(shù)據(jù)

4绳矩、初始值與結(jié)果異或值

在一些標(biāo)準(zhǔn)中罩润,規(guī)定了初始值,則數(shù)據(jù)在進(jìn)行上述二項(xiàng)式運(yùn)算之前翼馆,需要先將要計(jì)算的數(shù)據(jù)與初始值的最低字節(jié)進(jìn)行異或割以,然后再與多項(xiàng)式進(jìn)行計(jì)算。

而在結(jié)果異或值不為零的情況下应媚,則需要將計(jì)算得到的CRC結(jié)果值再與結(jié)果異或值進(jìn)行一次異或計(jì)算严沥,得到的最終值才是我們需要的CRC校驗(yàn)碼。

這里可以看出中姜,初始值與結(jié)果值的位數(shù)要求與數(shù)據(jù)寬度一致消玄。

5、輸入值反轉(zhuǎn)與輸出值反轉(zhuǎn)

輸入值反轉(zhuǎn)的意思是在計(jì)算之前先將二項(xiàng)式反轉(zhuǎn)丢胚,然后再用得到的新值和數(shù)據(jù)進(jìn)行計(jì)算翩瓜。如對于G(X)=X16+X15+X2+1(16#18005),其正向值為1 1000 0000 0000 0101携龟,反轉(zhuǎn)值則為1010 0000 0000 0001 1

輸出值反轉(zhuǎn)則是將最終得到的CRC結(jié)果反轉(zhuǎn)兔跌。

通常,輸入值反轉(zhuǎn)后的結(jié)果值也會是反轉(zhuǎn)的峡蟋,所以這兩個選項(xiàng)一般是同向的坟桅,我們只有在在線CRC計(jì)算器中會看到自由選擇正反轉(zhuǎn)的情況存在。

那么蕊蝗,這里引用CSDN博主bobde163的一段總結(jié):

CRC16仅乓、CRC32等多字節(jié)的校驗(yàn)值的計(jì)算有幾點(diǎn)需要清楚(只針對一次一個字節(jié)的算法):

1) 初始值不為0的情況下,該如何計(jì)算:

輸入數(shù)據(jù)需要反轉(zhuǎn):先將要計(jì)算的數(shù)據(jù)與初始值的最低字節(jié)進(jìn)行異或匿又,再與反轉(zhuǎn)后的多項(xiàng)式進(jìn)行計(jì)算方灾。

輸入數(shù)據(jù)不需要反轉(zhuǎn):先將要計(jì)算的數(shù)據(jù)左移到與初始值對齊的位置(如CRC16算法,則左移8位碌更,低位填充0裕偿;如CRC32算法,則左移24位痛单,低位填充0)與初始值進(jìn)行異或嘿棘,再與正常的多項(xiàng)式進(jìn)行計(jì)算。

2) 結(jié)果異或值不為0的情況:第一步算得到的CRC值再與結(jié)果異或值進(jìn)行異或操作得到最終的校驗(yàn)值:

輸出數(shù)據(jù)反轉(zhuǎn):如果輸入數(shù)據(jù)是反轉(zhuǎn)的模式旭绒,則結(jié)果也是反轉(zhuǎn)的

輸出數(shù)據(jù)不反轉(zhuǎn):如果輸入數(shù)據(jù)是不反轉(zhuǎn)的模式鸟妙,則結(jié)果也是不反轉(zhuǎn)的

3)初始值的選擇是可自己定義焦人,很多不同的廠家使用的初始值是不一樣,不一樣的初始值得到的結(jié)果也是不一樣的重父。

---------------------

作者:bobde163

來源:CSDN

原文:https://blog.csdn.net/bobde163/article/details/78760213

不同的二項(xiàng)式花椭、初始值、結(jié)果異或值房午、反轉(zhuǎn)原則都會造成最終的結(jié)果不一致矿辽,這就是為什么明明是正確的計(jì)算方式,有時候算出來的結(jié)果卻總是不正確郭厌。

那么袋倔,如何去判斷應(yīng)該采用哪些原則呢?這里談到最后一個概念:

6折柠、參數(shù)模型

雖然CRC可以任意定義二項(xiàng)式宾娜、數(shù)據(jù)長度等,但沒有一個統(tǒng)一的標(biāo)準(zhǔn)的話扇售,就會讓整個計(jì)算變得非常的麻煩前塔。但實(shí)際上,不同的廠家經(jīng)常采用不同的標(biāo)準(zhǔn)算法缘眶,這里列出了一些國際常用的模型表:

以上為關(guān)于CRC的筆記嘱根,下一篇講一講高級語言實(shí)現(xiàn)思路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巷懈,隨后出現(xiàn)的幾起案子该抒,更是在濱河造成了極大的恐慌,老刑警劉巖顶燕,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑保,死亡現(xiàn)場離奇詭異,居然都是意外死亡涌攻,警方通過查閱死者的電腦和手機(jī)欧引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恳谎,“玉大人芝此,你說我怎么就攤上這事∫蛲矗” “怎么了婚苹?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸵膏。 經(jīng)常有香客問我膊升,道長,這世上最難降的妖魔是什么谭企? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任廓译,我火速辦了婚禮评肆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘非区。我一直安慰自己瓜挽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布院仿。 她就那樣靜靜地躺著秸抚,像睡著了一般速和。 火紅的嫁衣襯著肌膚如雪歹垫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天颠放,我揣著相機(jī)與錄音排惨,去河邊找鬼。 笑死碰凶,一個胖子當(dāng)著我的面吹牛暮芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欲低,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼辕宏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砾莱?” 一聲冷哼從身側(cè)響起瑞筐,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腊瑟,沒想到半個月后聚假,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闰非,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年膘格,在試婚紗的時候發(fā)現(xiàn)自己被綠了财松。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪贱。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡辆毡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胚迫,到底是詐尸還是另有隱情喷户,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布访锻,位于F島的核電站闹获,受9級特大地震影響河哑,放射性物質(zhì)發(fā)生泄漏避诽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一璃谨、第九天 我趴在偏房一處隱蔽的房頂上張望沙庐。 院中可真熱鬧,春花似錦佳吞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹊汛。三九已至阱冶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間木蹬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工有梆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泥耀。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓蛔添,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迎瞧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容