C XOR CRC16 校驗碼計算類

2021-09-12 06:07:25 字數 3967 閱讀 6214

cyclic redundancy check迴圈冗餘檢驗,是基於資料計算一組效驗碼,用於核對資料傳輸過程中是否被更改或傳輸錯誤。

1、迴圈校驗碼(crc碼):

是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。

2、生成crc碼的基本原理:

任意乙個由二進位制位串組成的**都可以和乙個係數僅為『0』和『1』取值的多項式一一對應。例如:**1010111對應的多項式為x6+x4+x2+x+1,而多項式為x5+x3+x2+x+1對應的**101111。

標準crc生成多項式如下表:

名稱          生成多項式              簡記式*   標準引用

crc-4         x4+x+1                  3         itu g.704

crc-8         x8+x5+x4+1              0x31                   

crc-8         x8+x2+x1+1              0x07                   

crc-8         x8+x6+x4+x3+x2+x1       0x5e

crc-12        x12+x11+x3+x+1          80f

crc-16        x16+x15+x2+1            8005      ibm sdlc

crc16-ccitt  x16+x12+x5+1   1021   iso hdlc, itu x.25, v.34/v.41/v.42, ppp-fcs

crc-32      x32+x26+x23+...+x2+x+1 04c11db7 zip, rar, ieee 802 lan/fddi, ieee 1394, ppp-fcs

crc-32c     x32+x28+x27+...+x8+x6+1 1edc6f41     sctp

3、crc-16校驗碼的使用:

現選擇最常用的crc-16校驗,說明它的使用方法。

根據modbus協議,常規485通訊的資訊傳送形式如下:

位址  功能碼   資料資訊  校驗碼

1byte   1byte   nbyte    2byte  

crc校驗是前面幾段資料內容的校驗值,為乙個16位資料,傳送時,低8位在前,高8為最後。

例如:資訊字段**為: 1011001,校驗欄位為:1010。

傳送方:發出的傳輸欄位為:1 0 1 1 0 0 1 1 0 10

資訊字段       校驗字段

接收方:使用相同的計算方法計算出資訊欄位的校驗碼,對比接收到的實際校驗碼,如果相等及資訊正確,不相等則資訊錯誤;或者將接受到的所有資訊除多項式,如果能夠除盡,則資訊正確。

4、crc-16校驗碼計算方法:

常用查表法和計算法。計算方法一般都是:

(1)、預置1個16位的暫存器為十六進製制ffff(即全為1),稱此暫存器為crc暫存器;

(2)、把第乙個8位二進位制資料(既通訊資訊幀的第乙個位元組)與16位的crc暫存器的低

8位相異或,把結果放於crc暫存器,高八位資料不變;

(3)、把crc暫存器的內容右移一位(朝低位)用0填補最高位,並檢查右移後的移出位;

(4)、如果移出位為0:重複第3步(再次右移一位);如果移出位為1,crc暫存器與多

項式a001(1010 0000 0000 0001)進行異或;

(5)、重複步驟3和4,直到右移8次,這樣整個8位資料全部進行了處理;

(6)、重複步驟2到步驟5,進行通訊資訊幀下乙個位元組的處理;

(7)、將該通訊資訊幀所有位元組按上述步驟計算完成後,得到的16位crc暫存器的高、低

位元組進行交換;

(8)、最後得到的crc暫存器內容即為:crc碼。

以上計算步驟中的多項式a001是8005按位顛倒後的結果。

查表法是將移位異或的計算結果做成了乙個表,就是將0~256放入乙個長度為16位的暫存器中的低八位,高八位填充0,然後將該暫存器與多項式0xa001按照上述3、4步驟,直到八位全部移出,最後暫存器中的值就是**中的資料,高八位、低八位分別單獨乙個表。

using system;  

using system.collections.generic;

using system.text;

namespace comm.lib

return check;

} /// /// 計算按位異或校驗和(返回包含校驗和的完整命令陣列)

///

/// 命令陣列

/// 包含校驗和的完整命令陣列

public static byte getxorfull(byte cmd)

#endregion

#region crc16查表法

#region crc對應表

//高位表

readonly static byte crchigh = new byte;

//低位表

readonly static byte crclow = new byte;

#endregion

/// /// 計算crc16迴圈校驗碼

///

/// 命令陣列

/// 高位是否在前

/// 高低位校驗碼

public static byte getcrc16(byte cmd, bool ishighbefore)

if (ishighbefore == true)

; }

else

; }

} /// /// 計算crc16迴圈校驗碼(返回包含校驗碼的完整命令陣列)

///

/// 命令陣列

/// 高位是否在前

///

public static byte getcrc16full(byte cmd, bool ishighbefore)

#endregion

#region 多項式引數 crc16計算

/// /// 多項式引數 crc16計算

///

/// 命令

/// 多項式

/// 高位是否在前

///

public static byte getcrc16bypoly(byte cmd, ushort poly, bool ishighbefore)

else

} }

byte check=bitconverter.getbytes(crcvalue);

if (ishighbefore == true)

; }

else

} /// /// 多項式引數 crc16計算

///

/// 命令

/// 多項式

/// 高位是否在前

///

public static byte getcrc16bypolyfull(byte cmd, ushort poly, bool ishighbefore)

#endregion

} }

JAVA CRC16校驗碼計算

package com.hcs.lqjc.controller.dongdahengfeng.modbus.utils author lwt date 2018 06 26 crc16校驗碼計算 1 預置1個16位的暫存器為十六進製制ffff 即全為1 稱此暫存器為crc暫存器 2 把第乙個8位二進...

身份證校驗碼計算

最近看乙份文件看到身份證規則,覺得很有趣,這裡記錄一下如何計算校驗碼 中華人民共和國國家標準gb 11643 1999 中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為 簡單舉例 現在去翻了國標文件 gb t 2260 翻到四川省廣元...

Java生成CRC16資料校驗碼

crc即迴圈冗餘校驗碼 cyclic redundancy check 1 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸...