C# CRC8的實現(原創)


  最近由於要做一個串口控制類的上位機程序,需要用CRC校驗發送和接收的數據,於是上網搜相關內容,發現此類文章並不多,都是互相抄襲,沒有自己的想法,我於是就自己仔細思考和實驗了一下,發現並不難實現。

CRC的原理:不准確的說就是用數據包除以CRC多項式。

數據包不用說了,CRC多項式是什么呢?CRC多項式就是一個8bit的數,要求最高位是1,因此CRC16的CRC多項式就是16bit,CRC32的CRC多項式就是32bit。

那么怎么除呢?就是把數據包和CRC多項式按位異或,一直異或到最后一位,最后結果就是CRC的值。

廢話不多講,舉一個例子看看:

CRC多項式取0x85,即1000 0101

數據包取byte型的數組,這里取三字節。{0x11,0x22,0x33}

運算步驟如下:

無標題

最后的結果就是0100 0001即0x41。

知道這個原理,代碼就好寫了,下面再貼上C#的源碼:

   1: /// <summary>
   2:        /// CRC8CCITT式校驗
   3:        /// </summary>
   4:        /// <param name="crcPoly">校驗多項式 byte</param>
   5:        /// <param name="data">數據</param>
   6:        /// <returns>返回原數組+CRC校驗字節</returns>
   7:        public int CRC8CCITT(byte crcPoly, byte[] data)
   8:        {
   9:            byte CRCPoly = 0x85;//CRC多項式,當做除數
  10:            byte[] Data = data;
  11:            byte CRCTempResult = 0x00;//CRC結果運算的得數,但不是最后的值
  12:            byte CRCResult = 0x00;//CRC結果運算最后的值
  13:  
  14:            CRCTempResult = (byte)(Data[0] ^ CRCPoly);
  15:  
  16:            for (int arrayLength = 1; arrayLength <= (data.Length-1); arrayLength++)
  17:            {
  18:                for (int i = 0; i < 8; i++)
  19:                {
  20:                    if ((CRCTempResult & 0x80) == 0x00)
  21:                    {
  22:                        CRCTempResult = (byte)(CRCTempResult << 1);
  23:                        CRCTempResult = (byte)(
  24:                                                            CRCTempResult |
  25:                                                            ((Data[arrayLength] & 0x80) == 0x80 ? 0x01 : 0x00)
  26:                                                          );
  27:                        Data[arrayLength] <<= 1;
  28:                    }
  29:                    else
  30:                    {
  31:                        CRCTempResult = (byte)(CRCTempResult ^ CRCPoly);
  32:                        i--;
  33:                    }
  34:                }
  35:            }
  36:            CRCResult = CRCTempResult;
  37:            return CRCResult;
  38:        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM