1. 程式人生 > >C#:迴圈冗餘校驗CRC-16-CCITT和CRC-32-IEEE 802.3

C#:迴圈冗餘校驗CRC-16-CCITT和CRC-32-IEEE 802.3

  1. /* ---------------------------------------------------------- 
  2. 檔名稱:CRC16.cs 
  3. 作者:秦建輝 
  4. MSN:[email protected] 
  5. QQ:36748897 
  6. 部落格:http://blog.csdn.net/jhqin 
  7. 開發環境: 
  8.     Visual Studio V2010 
  9.     .NET Framework 4 Client Profile 
  10. 版本歷史:     
  11.     V1.0    2011年11月15日 
  12.             迴圈冗餘校驗:CRC-16-CCITT 
  13. ------------------------------------------------------------ */
      
  14. using System;  
  15. namespace Splash.Security.Cryptography  
  16. {  
  17.     /// <summary>  
  18.     /// 迴圈冗餘檢驗:CRC-16-CCITT查表法  
  19.     /// </summary>  
  20.     public static partial class CRCITU  
  21.     {         
  22.         /// <summary>  
  23.         /// 計算給定長度資料的16位CRC  
  24.         /// </summary>  
  25.         /// <param name="data">要計算CRC的位元組陣列</param>
      
  26.         /// <returns>CRC值</returns>  
  27.         public static UInt16 GetCrc16(Byte[] data)  
  28.         {   // 初始化  
  29.             Int32 High = 0xFF;  // 高位元組  
  30.             Int32 Low = 0xFF;   // 低位元組  
  31.             if(data != null)  
  32.             {  
  33.                 foreach(Byte b in data)  
  34.                 {  
  35.                     Int32 Index = Low ^ b;  
  36.                     Low = High ^ CRC16TABLE_LO[Index];  
  37.                     High = CRC16TABLE_HI[Index];  
  38.                 }             
  39.             }  
  40.             return (UInt16)(~((High << 8) + Low));    // 取反  
  41.         }  
  42.         /// <summary>  
  43.         /// 檢查給定長度資料的16位CRC是否正確  
  44.         /// </summary>  
  45.         /// <param name="data">要校驗的位元組陣列</param>  
  46.         /// <returns>  
  47.         ///     true:正確  
  48.         ///     false:錯誤  
  49.         /// </returns>  
  50.         /// <reamrks>  
  51.         /// 位元組陣列最後2個位元組為校驗碼,且低位元組在前面,高位元組在後面  
  52.         /// </reamrks>  
  53.         public static Boolean IsCrc16Good(Byte[] data)  
  54.         {  
  55.             // 初始化  
  56.             Int32 High = 0xFF;  
  57.             Int32 Low = 0xFF;  
  58.             if(data != null)  
  59.             {  
  60.                 foreach(Byte b in data)  
  61.                 {  
  62.                     Int32 Index = Low ^ b;  
  63.                     Low = High ^ CRC16TABLE_LO[Index];  
  64.                     High = CRC16TABLE_HI[Index];  
  65.                 }             
  66.             }  
  67.             return (High == 0xF0 && Low == 0xB8);  
  68.         }  
  69.         /// <summary>  
  70.         /// CRC16查詢表高位元組  
  71.         /// </summary>  
  72.         private static readonly Byte[] CRC16TABLE_HI =  
  73.         {  
  74.             0x00, 0x11, 0x23, 0x32, 0x46, 0x57, 0x65, 0x74, 0x8C, 0x9D, 0xAF, 0xBE, 0xCA, 0xDB, 0xE9, 0xF8,  
  75.             0x10, 0x01, 0x33, 0x22, 0x56, 0x47, 0x75, 0x64, 0x9C, 0x8D, 0xBF, 0xAE, 0xDA, 0xCB, 0xF9, 0xE8,  
  76.             0x21, 0x30, 0x02, 0x13, 0x67, 0x76, 0x44, 0x55, 0xAD, 0xBC, 0x8E, 0x9F, 0xEB, 0xFA, 0xC8, 0xD9,  
  77.             0x31, 0x20, 0x12, 0x03, 0x77, 0x66, 0x54, 0x45, 0xBD, 0xAC, 0x9E, 0x8F, 0xFB, 0xEA, 0xD8, 0xC9,  
  78.             0x42, 0x53, 0x61, 0x70, 0x04, 0x15, 0x27, 0x36, 0xCE, 0xDF, 0xED, 0xFC, 0x88, 0x99, 0xAB, 0xBA,  
  79.             0x52, 0x43, 0x71, 0x60, 0x14, 0x05, 0x37, 0x26, 0xDE, 0xCF, 0xFD, 0xEC, 0x98, 0x89, 0xBB, 0xAA,  
  80.             0x63, 0x72, 0x40, 0x51, 0x25, 0x34, 0x06, 0x17, 0xEF, 0xFE, 0xCC, 0xDD, 0xA9, 0xB8, 0x8A, 0x9B,  
  81.             0x73, 0x62, 0x50, 0x41, 0x35, 0x24, 0x16, 0x07, 0xFF, 0xEE, 0xDC, 0xCD, 0xB9, 0xA8, 0x9A, 0x8B,  
  82.             0x84, 0x95, 0xA7, 0xB6, 0xC2, 0xD3, 0xE1, 0xF0, 0x08, 0x19, 0x2B, 0x3A, 0x4E, 0x5F, 0x6D, 0x7C,  
  83.             0x94, 0x85, 0xB7, 0xA6, 0xD2, 0xC3, 0xF1, 0xE0, 0x18, 0x09, 0x3B, 0x2A, 0x5E, 0x4F, 0x7D, 0x6C,  
  84.             0xA5, 0xB4, 0x86, 0x97, 0xE3, 0xF2, 0xC0, 0xD1, 0x29, 0x38, 0x0A, 0x1B, 0x6F, 0x7E, 0x4C, 0x5D,  
  85.             0xB5, 0xA4, 0x96, 0x87, 0xF3, 0xE2, 0xD0, 0xC1, 0x39, 0x28, 0x1A, 0x0B, 0x7F, 0x6E, 0x5C, 0x4D,  
  86.             0xC6, 0xD7, 0xE5, 0xF4, 0x80, 0x91, 0xA3, 0xB2, 0x4A, 0x5B, 0x69, 0x78, 0x0C, 0x1D, 0x2F, 0x3E,  
  87.             0xD6, 0xC7, 0xF5, 0xE4, 0x90, 0x81, 0xB3, 0xA2, 0x5A, 0x4B, 0x79, 0x68, 0x1C, 0x0D, 0x3F, 0x2E,  
  88.             0xE7, 0xF6, 0xC4, 0xD5, 0xA1, 0xB0, 0x82, 0x93, 0x6B, 0x7A, 0x48, 0x59, 0x2D, 0x3C, 0x0E, 0x1F,  
  89.             0xF7, 0xE6, 0xD4, 0xC5, 0xB1, 0xA0, 0x92, 0x83, 0x7B, 0x6A, 0x58, 0x49, 0x3D, 0x2C, 0x1E, 0x0F  
  90.         };  
  91.         /// <summary>  
  92.         /// CRC16查詢表低位元組  
  93.         /// </summary>  
  94.         private static readonly Byte[] CRC16TABLE_LO =   
  95.         {  
  96.             0x00, 0x89, 0x12, 0x9B, 0x24, 0xAD, 0x36, 0xBF, 0x48, 0xC1, 0x5A, 0xD3, 0x6C, 0xE5, 0x7E, 0xF7,  
  97.             0x81, 0x08, 0x93, 0x1A, 0xA5, 0x2C, 0xB7, 0x3E, 0xC9, 0x40, 0xDB, 0x52, 0xED, 0x64, 0xFF, 0x76,  
  98.             0x02, 0x8B, 0x10, 0x99, 0x26, 0xAF, 0x34, 0xBD, 0x4A, 0xC3, 0x58, 0xD1, 0x6E, 0xE7, 0x7C, 0xF5,  
  99.             0x83, 0x0A, 0x91, 0x18, 0xA7, 0x2E, 0xB5, 0x3C, 0xCB, 0x42, 0xD9, 0x50, 0xEF, 0x66, 0xFD, 0x74,  
  100.             0x04, 0x8D, 0x16, 0x9F, 0x20, 0xA9, 0x32, 0xBB, 0x4C, 0xC5, 0x5E, 0xD7, 0x68, 0xE1, 0x7A, 0xF3,  
  101.             0x85, 0x0C, 0x97, 0x1E, 0xA1, 0x28, 0xB3, 0x3A, 0xCD, 0x44, 0xDF, 0x56, 0xE9, 0x60, 0xFB, 0x72,  
  102.             0x06, 0x8F, 0x14, 0x9D, 0x22, 0xAB, 0x30, 0xB9, 0x4E, 0xC7, 0x5C, 0xD5, 0x6A, 0xE3, 0x78, 0xF1,  
  103.             0x87, 0x0E, 0x95, 0x1C, 0xA3, 0x2A, 0xB1, 0x38, 0xCF, 0x46, 0xDD, 0x54, 0xEB, 0x62, 0xF9, 0x70,  
  104.             0x08, 0x81, 0x1A, 0x93, 0x2C, 0xA5, 0x3E, 0xB7, 0x40, 0xC9, 0x52, 0xDB, 0x64, 0xED, 0x76, 0xFF,  
  105.             0x89, 0x00, 0x9B, 0x12, 0xAD, 0x24, 0xBF, 0x36, 0xC1, 0x48, 0xD3, 0x5A, 0xE5, 0x6C, 0xF7, 0x7E,  
  106.             0x0A, 0x83, 0x18, 0x91, 0x2E, 0xA7, 0x3C, 0xB5, 0x42, 0xCB, 0x50, 0xD9, 0x66, 0xEF, 0x74, 0xFD,  
  107.             0x8B, 0x02, 0x99, 0x10, 0xAF, 0x26, 0xBD, 0x34, 0xC3, 0x4A, 0xD1, 0x58, 0xE7, 0x6E, 0xF5, 0x7C,  
  108.             0x0C, 0x85, 0x1E, 0x97, 0x28, 0xA1, 0x3A, 0xB3, 0x44, 0xCD, 0x56, 0xDF, 0x60, 0xE9, 0x72, 0xFB,  
  109.             0x8D, 0x04, 0x9F, 0x16, 0xA9, 0x20, 0xBB, 0x32, 0xC5, 0x4C, 0xD7, 0x5E, 0xE1, 0x68, 0xF3, 0x7A,  
  110.             0x0E, 0x87, 0x1C, 0x95, 0x2A, 0xA3, 0x38, 0xB1, 0x46, 0xCF, 0x54, 0xDD, 0x62, 0xEB, 0x70, 0xF9,  
  111.             0x8F, 0x06, 0x9D, 0x14, 0xAB, 0x22, 0xB9, 0x30, 0xC7, 0x4E, 0xD5, 0x5C, 0xE3, 0x6A, 0xF1, 0x78  
  112.         };  
  113.     }  
  114. }  

相關推薦

C#迴圈CRC-16-CCITTCRC-32-IEEE 802.3

/* ---------------------------------------------------------- 檔名稱:CRC16.cs 作者:秦建輝 MSN:[email protected] QQ:36748897 部落格:http://blog.csdn.net/jhqin 開發環

迴圈檢錯方案(CRC

1、crc校驗原理 crc校驗的根本思想就是在要傳送的幀後面附加一個二進位制序列,生成一個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要使生成的新幀能與傳送端和接收端共同選定的某個特定數整除,需要注意的是,這裡不是採用的二進位制除法,而是採用“模2除法”。到達接收端後,再把接收到的新幀除以(模2除)這個

迴圈CRC) 計算的C++ 程式碼

最近經常有人發私信給我找我幫忙計算 CRC 校驗。其實我有一篇部落格 http://blog.csdn.net/liyuanbhu/article/details/7882789 裡面介紹了CRC 計算的原理,也給出了些程式碼,裡面的程式碼稍微改改就能計算常

迴圈碼(CRC)應用總結(包括C++原始碼)

 最近在實習期間需要用到資料的校驗,所選為CRC16,那麼就在此總結一番吧。 現在此說明下什麼是CRC:迴圈冗餘碼校驗 英文名稱為Cyclical Redundancy Check,簡稱CRC,它是利用除法及餘數的原理來作錯誤偵測(Error Detecting)的。實際應

CRC---迴圈

typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned short uInt16; uint crc; // CRC 碼 uint

差錯檢測 — 迴圈CRC

  現實中通訊鏈路都不會是理想的,位元在傳輸的過程中可能會出現差錯,1可能變成0,0也可能變成1,這就叫做位元差錯。位元差錯是傳輸差錯的一種,因此為了保證資料傳輸的可靠性,在計算網路傳輸資料時,必須採用各種檢驗措施來處理位元差錯。目前在資料鏈路層廣泛使用了迴圈冗餘的CRC的檢錯技術。

迴圈CRC)的簡單應用實踐

前言 一般來說,資料資訊在傳輸過程中有時會受到外界有意或無意的干擾行為,出現數據的篡改和破壞現象,造成資料接收端的不一致行為。於是乎,在資訊領域有了資料校驗的概念,今天本文主要來簡單聊聊其中的經典使用演算法CRC(迴圈冗餘校驗)以及其在Ozone中的應用實踐。 CRC和Ch

CRC迴圈)演算法入門

寫給嵌入式程式設計師的迴圈冗餘校驗(CRC)演算法入門引導前言CRC校驗(迴圈冗餘校驗)是資料通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到CRC 演算法對各種資料進行校驗。因此,掌握基本的CRC演算法應是嵌入式程式設計師的基本技能。可是,我認識的嵌入式程式設計師中

迴圈CRC)演算法入門引導

前言 CRC校驗(迴圈冗餘校驗)是資料通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到CRC 演算法對各種資料進行校驗。因此,掌握基本的CRC演算法應是嵌入式程式設計師的基本技能。可是,我認識的嵌入式程式設計師中能真正掌握CRC演算法的人卻很少,平常在專案中見到的C

迴圈碼計算CRC

CRC迴圈冗餘檢驗碼的計算題 1、若資訊碼字為11100011,生成多項式 G(X)=X5+X4+X+1,則計算出的 CRC 校驗碼為? x的最高次冪5則 資訊碼(被除數)補五個0為:111000

STM32F4學習筆記11——CRC迴圈

關於CRC校驗有以下幾個方面 1.模2除(也就是異或)。 2.多項式與二進位制關係(x的最高冪次對應二進位制數的最高位,以下各位對應多項式的各冪次,有此冪次項對應1,無此冪次項對應0,x的最高冪次為R,轉換成對應的二進位制數有R+1位。)。 CRC基本原理

Qt---CRC迴圈

#include "mainwindow.h" #include <QApplication> #include <QDebug> #define POLY 0x1021

CRC迴圈學習及總結

一、什麼是CRC冗餘校驗? 迴圈冗餘校驗(Cyclic Redundancy Check, CRC)是一種根據網路資料包或電腦檔案等資料產生簡短固定位數校驗碼的一種雜湊函式,主要用來檢測或校驗資料傳輸

CRC迴圈計算

個人網站: 黑客攻防學習課程: 號外:新課上線啦~~ 電腦端學習入口: 手機端學習入口:請掃二維碼~ 如果本部落格對你的有所幫助,不妨小額打賞下博主,您的鼓勵是我不斷寫部落格的動力。關於金額多少隨意,心意到就好。博主萬分感

CRC迴圈

Ⅰ.CRC校驗        CRC(Cyclic Redundancy Check):即迴圈冗餘檢驗碼,是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。 Ⅱ.

計算機網路 CRC迴圈

4.使用迴圈冗餘校驗碼CRC, 接收方如何檢查收到的資訊有無錯誤(一個簡單通俗的模型) 首先接收方和傳送方約定一個“生成多項式”g(x); 傳送方傳送的是T(x),接收方接收到的是R(x),若T(x)和R(X)相等,則傳輸的過程中沒有出現錯誤。 傳送方要傳輸的資訊info包

迴圈基本演算法

也稱為多項式編碼,是鏈路層廣泛使用的更具糾錯能力的方法 基本思想: 將位串看成是係數為 0 或 1 的多項式。一個 k 位幀看作是一個 k-1 次多項式的係數列表,該多項式共有 k 項,從 xk-1 到 XO。這樣的多項式認為是 k-1 階多項式。高次(最左邊〉位是 xk-1 項的係

迴圈碼例題[轉帖]

【例】假設使用的生成多項式是G(x)=x^3+x+1。4位的原始報文為1010,求編碼後的報文。 解: 1、將生成多項式G(x)=x^3+x+1轉換成對應的二進位制除數1011。 2、此題生成多項式有4位(R+1),要把原始報文C(x)左移3(R)位變成1010000 3、用生成多項式對應的二進位制數對左移4

CAN匯流排中迴圈碼的原理

在CAN系統中為保證報文傳輸的正確性,需要對通訊過程進行差錯控制。目前常用的方法是反饋重發,即一旦收到接收端發出的出錯資訊,傳送端便自動重發,此時的差錯控制只需要檢錯功能。常用的檢錯碼有兩類:奇偶校驗碼和迴圈冗餘校驗碼。奇偶校驗碼是一種最常見的檢錯碼,其實現方法簡單,但檢錯能

資料鏈路層迴圈檢驗CRC

在傳送端,先把資料劃分為組,假定每組 k 個位元。現假定傳送的資料 M=101001       ( k=6 )。CRC運算就是在資料 M 的後面新增供差錯檢測用的 n 位冗餘碼,然後構成一個幀傳送出去