簡述CRC16算法

CRC校驗算法即循環(huán)冗余校驗算法,利用除法及余數(shù)的原理,實現(xiàn)錯誤偵測的功能,主要用來檢測或校核數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤。CRC算法有很多種,比如CRC32、CRC16等等。下面我們就來了解一下CRC16算法。

CRC16算法簡介

CRC16算法使用16次方的多項式來生成校驗和,該算法將數(shù)據(jù)視為一系列位,并對該序列執(zhí)行位分割運算,使用多項式進行除法運算。這個除法的余數(shù)就是CRC16校驗和,它被附加到原始數(shù)據(jù)的末尾。

CRC16算法

CRC16算法的計算原理

  1. 根據(jù)CRC16的標準選擇初值CRCIn的值。
  2. 將數(shù)據(jù)的第一個字節(jié)與CRCIn高8位異或。
  3. 判斷最高位,若該位為 0 左移一位,若為 1 左移一位再與多項式Hex碼異或。
  4. 重復3直至8位全部移位計算結束。
  5. 重復將所有輸入數(shù)據(jù)操作完成以上步驟,所得16位數(shù)即16位CRC校驗碼。

CRC16算法

CRC16算法的計算過程

  1. 預置1個16位的寄存器為十六進制FFFF(即全為1);稱此寄存器為CRC寄存器;
  2. 把第一個8位二進制數(shù)據(jù) (即通訊信息幀的第一個字節(jié))與16位的CRC寄存器的第8位相異或,把結果放于CRC寄存器;
  3. 把CRC寄存器的內容右移一位(最低位)用0填補最高位,并檢查右移后的移出位;
  4. 如果移出位為0:重復第3步(再次右移一位);如果移出位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進行異或;(Modbus)
  5. 重復步驟3和4,直到右移8次,這樣整個8位數(shù)據(jù)全部進行了處理;
  6. 重復步驟2到步驟5,進行通訊信息幀下一個字節(jié)的處理;
  7. 將該通訊信息幀所有字節(jié)按上述步驟計算完成后,得到的16位CRC寄存器的高、低字節(jié)進行交換;
  8. 最后得到的CRC寄存器內容即為:CRC碼。

CRC16算法的變體

CRC16算法有以下幾種常見變體,它們算法原理基本一致,就是在數(shù)據(jù)的輸入和輸出有所差異:

  • CRC16_CCITT:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,結果與0x0000異或。
  • CRC16_CCITT_FALSE:多項式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,結果與0x0000異或。
  • CRC16_XMODEM:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,結果與0x0000異或。
  • CRC16_X25:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,結果與0xFFFF異或。
  • CRC16_MODBUS:多項式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,結果與0x0000異或。
  • CRC16_IBM:多項式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,結果與0x0000異或。
  • CRC16_MAXIM:多項式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,結果與0xFFFF異或。
  • CRC16_USB:多項式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,結果與0xFFFF異或。

CRC16算法

CRC16算法的應用

CRC16常用于通信協(xié)議中,當接收到數(shù)據(jù)時,接收器可以使用相同的算法計算自己的校驗和,并將其與接收到的數(shù)據(jù)一起進行比較。如果兩個校驗和匹配,數(shù)據(jù)被認為是無誤的。如果它們不匹配,就假定在傳輸過程中發(fā)生了錯誤,數(shù)據(jù)可能需要重新傳輸。

免責聲明:素材源于網絡,如有侵權,請聯(lián)系刪稿。