CRC16校驗研究與實現

2021-08-27 08:51:41 字數 2180 閱讀 3410

最近工作需要,使用了crc16校驗。經過網上學習,發現有很多種crc16校驗演算法。經過多處資料總結,形成一種通用的crc16校驗方法。

crc計算原理就不再敘述(網上很多)。現在介紹crc校驗的幾個關鍵引數:

poly:生成項的簡寫,以16進製表示。例如:crc-32即是0x04c11db7,忽略了最高位的"1",即完整的生成項是0x104c11db7。 

init:這是演算法開始時暫存器(crc)的初始化預置值,十六進製制表示。 

refin:待測資料的每個位元組是否按位反轉,true或false。 

refout:在計算後之後,異或輸出之前,整個資料是否按位反轉,true或false。 

xorout:計算結果與此引數異或後得到最終的crc值。

下面給出crc16校驗的實現**(c#):

public static byte reverse8(byte c)

public static ushort reverse16(ushort x)

///

/// crc16 校驗計算(有輸入輸出值反轉)

///

/// 輸入buffer

/// crc初值

/// 多項式

/// 結果異或值

/// 輸入值反轉使能

/// 輸出值反轉使能

/// 高位在前

/// 計算起始引索

/// 計算結束引索

///

public static byte getcrc16bypoly(byte cmd, ushort crcini, ushort poly, ushort oxans, bool indatagainst, bool outdatagainst, bool ishighbefore, int nstart, int nend = 0)

else

crc <<= 1;                   

}              

}if (outdatagainst)

crcvalue = reverse16(crcvalue);

crcvalue = (ushort)(crcvalue ^ oxans);

byte check = bitconverter.getbytes(crcvalue);

if (ishighbefore == true);}

else

}crc演算法名稱

多項式公式

多項式初始值

結果異或值

輸入值反轉

輸出值反轉

crc-16/ibm

16+x15+x2+1

8005

0000

0000

true

true

crc-16/maxim

16+x15+x2+1

8005

0000

ffff

true

true

crc-16/usb

16+x15+x2+1

8005

ffff

ffff

true

true

crc-16/modbus

16+x15+x2+1

8005

ffff

0000

true

true

crc-16/ccitt

16+x12+x5+1

1021

0000

0000

true

true

crc-16/ccitt-false

16+x12+x5+1

1021

ffff

0000

false

false

crc-16/x25

16+x12+x5+1

1021

ffff

ffff

true

true

crc-16/xmodem

16+x12+x5+1

1021

0000

0000

false

false

crc-16/dnp

16+x13+x12+x11+x10+x8+x6+x5+x2+1

3d65

0000

ffff

true

true

CRC 16校驗原理

1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc 碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111 對應的多項式為x6 x4 x2 x 1 而多項式為...

CRC16校驗演算法實現

迴圈冗餘碼校驗英文名稱為cyclical redundancy check,簡稱crc。它是利用除法及餘數的原理來作錯誤偵測 error detecting 的。實際應用時,傳送裝置計算出crc值並隨資料一同傳送給接收裝置,接收裝置對收到的資料重新計算crc並與收到的crc相比較,若兩個crc值不同...

碼crc校驗 CRC16校驗計算流程

首先再次確認計算步驟 1 預置1個16位的暫存器為十六進製制ffff 即全為1111 1111 1111 1111 稱此暫存器為crc暫存器 2 把第乙個位轉換成8位二進位制資料 既通訊資訊幀的第乙個位元組 與16位的crc暫存器的低8位相異或,把結果放於crc暫存器,高八位資料不變 3 把crc暫...