最近工作需要,使用了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暫...