<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>

          CRC校驗怎么算?

          共 3054字,需瀏覽 7分鐘

           ·

          2022-08-26 14:04

              關注、星標公眾號,直達精彩內(nèi)容

          來源:網(wǎng)路素材


          據(jù)說剛過去的高考數(shù)學很難,小編當年上學時挺喜歡數(shù)學的,最近特意復習了一下CRC校驗的計算過程。

          CRC是眾多校驗方式中的一種,校驗的目的是為了檢測數(shù)據(jù)的正確性。在詳細介紹CRC計算之前,我們先來看兩個常見的較為簡單點的校驗:串口通信中的奇偶校驗和身份證號碼中的MOD 11-2校驗。

          先看奇偶校驗,假設要發(fā)送8位數(shù)據(jù)10110101,奇校驗是再加一位校驗位,讓這9位數(shù)據(jù)中的1的個數(shù)為奇數(shù)。

          10110101->101101010   奇校驗

          偶校驗是讓這9位數(shù)據(jù)中1的個數(shù)為偶數(shù)。

          10110101->101101011    偶校驗

          接收方收到數(shù)據(jù)后計算其奇偶性,如果不對,則說明數(shù)據(jù)傳輸中發(fā)生了錯誤。

          奇偶校驗優(yōu)點是使用簡單,缺點是檢錯率有限,只有奇數(shù)個數(shù)據(jù)位發(fā)生變化的錯誤能檢測到,偶數(shù)個數(shù)據(jù)位變化的錯誤它檢測不了。

          最近拿著身份證去核酸檢測的次數(shù)太多了,讓我對身份證號碼的組成產(chǎn)生了興趣,尤其好奇的是為什么有的身份號號碼最后一位是X。身份證號碼總共18位,包括17位數(shù)字碼和1位校驗碼。

          1)1-6位是地址碼,表示編碼對象所在縣。

          2)7-14位是出生日期碼,表示編碼對象出生的年、月、日。

          3)15-17位是順序碼,表示在同一地址碼所標識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。

          4)校驗碼,用來檢驗身份證號碼是否正確,采用MOD 11-2校驗碼系統(tǒng)。

          校驗的公式如下:

          簡單來說它的校驗規(guī)則是:連校驗碼一起,由從右到左逐位乘以2的n次方取模11并求和,對11的余數(shù)必須為1。

          以一個身份證號碼11010519491231002X為例,

          校驗碼計算如下:

          1) 將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)。從左到右的系數(shù)分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

          2) 將這17位數(shù)字和對應的系數(shù)各自相乘的結(jié)果相加7+9+0+5+0+20+2+9+24+27+7+18+30+5+0+0+4=167;

          3) 用加出來的和167除以11,余數(shù)是2;

          4) 余數(shù)2對應校驗碼是X;

          看完上述計算方法之后,大家可以用自己的身份證號碼試試。

          該校驗算法據(jù)說可以:

          1) 如果某一位填錯了,則校驗算法可以檢測出來。

          2) 如果身份證號的相鄰2位填反了,則校驗算法可以檢測出來。

          這也是為什么要除以11而不是10的原因,其背后的數(shù)據(jù)理論推理已經(jīng)超出了我的能力范疇,這里不再介紹了。

          上面的兩種校驗和CRC校驗沒有什么關系,只是為了讓大家對校驗先有個感性的認識,下面來正式介紹CRC。

          我在網(wǎng)上找了兩個計算CRC的軟件,輸入同樣的數(shù)據(jù),選擇同樣的算法,得到的結(jié)果一樣,

          這兩個軟件的對應關系如下:

          把CRC Calculator Info 中的這幾個參數(shù)弄明白,CRC的過程你也就清楚了

          Name:算法的名稱,比如對于16bit的CRC來說就有好多個名字,也就是雖然都是16 bit CRC,但是計算方式也有好多種。

          Width:指的CRC校驗值的長度,通常有8bit,16bit,24bit,32bit等。

          Poly:是多項式的值,以上面圖中的CRC-8:x8+x2+x+1為例,它表示二進制為100000111,去掉最高位的1,十六進制表示就是0x07

          Init: Init 的位數(shù)和Poly的位數(shù)相同,它的值為全0或者全F,當全為0時,在算法開始前對數(shù)據(jù)(這個數(shù)據(jù)是根據(jù)RefIn的值得到的)后面補上CRC位數(shù)個0后就可以進行后續(xù)計算了。當全為1時,表示在算法開始前對數(shù)據(jù)的前CRC位數(shù)(高位)先和對應位數(shù)個1進行異或(即:前CRC位數(shù)的值按位取反),再在后面補上CRC位數(shù)個0,才進行后續(xù)計算。

          RefIn和Refout:它們要么全為False,要么全為True。

          RefIn為False表示,輸入的原始數(shù)據(jù)的每個字節(jié)的第7位作為最高有效位,第0位作為最低有效位,即正常計算即可

          當RefIn為True時,輸入的原始數(shù)據(jù)的每個字節(jié)需要做個逆序的處理,注意:針對的每個字節(jié),而不是整個數(shù)據(jù),以一個4字節(jié)的原始數(shù)據(jù)為例:

          當Refout為False時,輸出不做處理,當Refout為True,需要對輸出數(shù)據(jù)做一次整個數(shù)據(jù)的逆序處理,注意:這里做的逆序和RefIn不同,它不是按字節(jié)逆序,而是整個逆序,以CRC-32為例來說明,最后的數(shù)據(jù)為32位,當Refout為True時,翻轉(zhuǎn)如下:

          XorOut:表示根據(jù)上面參數(shù)計算完后,和這個數(shù)再進行一次異或。

          下面分析一下上面的結(jié)果0x79的由來:

          1) 0x13 對應二進制為00010011

          2) 由于RefIn為False,所以0x13不做處理還是00010011

          3) 因為Init為0x00,00010011后面加8個0即可,輸入數(shù)據(jù)變?yōu)?001001100000000

          4) 多項式為x8+x2+x+1 對應二進制100000111,將上述0001001100000000 除以該多項式對應的100000111

          整個計算過程如下:

          最后得到余數(shù):01111001

          5) 由于RefOuT為False,所以余數(shù)不變,還為01111001

          6) 由于Xorout為0,表示不用再取反,所以最終的結(jié)果就是01111001,即十六進制0x79

          算一個不過癮,我們再來計算一個

          這一次和上面唯一的不同是將初始值由原來的0x00換為了0xFF,這個例子就是給大家演示初始值到底什么意思.

          下面分析一下上面的結(jié)果0x79的由來:

          1) 0x13 對應二進制為00010011

          2) 由于RefIn為False,所以0x13不做處理還是00010011

          3) 因為Init為0xFF,00010011的高8位要先與0xFF異或,輸入數(shù)據(jù)變?yōu)?1101100,后面再加入8個0,變?yōu)?1110110000000000

          4) 多項式為x8+x2+x+1 對應二進制100000111,將上述1110110000000000 除以該多項式對應的100000111,最后得到余數(shù):10001010

          5) 由于RefOuT為False,所以余數(shù)不變,還為10001010

          6) 由于Xorout為0,表示不用再取反,所以最終的結(jié)果就是10001010,即十六進制0x8A

          這個例子演示了初始值的含義,我們再看最后一個例子,這個例子演示了RefIn和RefOut為True的具體含義

          1) 0x13 對應二進制為00010011

          2) 由于RefIn為True,所以0x13需要逆序一下得到11001000

          3) 因為Init為0x00,所以11001000后面直接添加4個0即可,得到110010000000

          4) 多項式為x4+x+1 對應二進制10011,將上述110010000000 除以10011,最后得到余數(shù):0010

          5) 由于RefOuT為True,所以余數(shù)要逆序變?yōu)?100

          6) 由于Xorout為0,表示不用再取反,所以最終的結(jié)果就是0100

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

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

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


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

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧洲性爱无码 | 天天日天天操天天日 | 婷婷激情在线发布 | 五月天黄色片 | 无码视频高清在线不卡 |