文章出處

C#代碼

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

 

Java代碼

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

 

C代碼

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace GovConsoleSuperior.Common
  7 {
  8     /// <summary>  
  9     /// 循環冗余檢驗:CRC-16-CCITT查表法  
 10     /// </summary>  
 11     public static partial class CRCITU
 12     {
 13         /// <summary>  
 14         /// 計算給定長度數據的16位CRC  
 15         /// </summary>  
 16         /// <param name="data">要計算CRC的字節數組</param>  
 17         /// <returns>CRC值</returns>  
 18         public static byte[] GetCrc16(Byte[] buffer)
 19         {
 20             int crc = 0;
 21             int l = buffer.Length;
 22             for (int i = 0; i < l; i++)
 23             {
 24                 int by = (crc >> 8) & 0xff;
 25                 crc = (crc & 0xffff) << 8;
 26                 crc = (crc ^ table[(buffer[i] ^ by) & 0xff]) & 0xffff;
 27             }
 28 
 29             return GetCRCBytes(crc);
 30 
 31         }
 32         /// <summary>
 33         /// 獲取CRC字節數組
 34         /// </summary>
 35         /// <param name="crc">整形的CRC</param>
 36         /// <returns>兩字節的CRC字節數組</returns>
 37         private static byte[] GetCRCBytes(int crc)
 38         {
 39             byte[] result = BitConverter.GetBytes(crc);
 40             Array.Resize(ref result, 2);                //只截取前面兩個byte字節
 41 
 42             return result;
 43         }
 44 
 45 
 46 
 47 
 48         static int[] table = {
 49             0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a,
 50             0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
 51             0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6,
 52             0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672,
 53             0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,
 54             0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af,
 55             0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd,
 56             0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,
 57             0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5,
 58             0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
 59             0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004,
 60             0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290,
 61             0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c,
 62             0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
 63             0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c,
 64             0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1,
 65             0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37,
 66             0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
 67             0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b,
 68             0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 
 69             };
 70 
 71         /// <summary>  
 72         /// 檢查給定長度數據的16位CRC是否正確  
 73         /// </summary>  
 74         /// <param name="FromHeadToVaild">要校驗的字節數組</param>  
 75         /// <returns>  
 76         ///     true:正確  
 77         ///     false:錯誤  
 78         /// </returns>  
 79         /// <reamrks>  
 80         /// 字節數組最后2個字節為校驗碼
 81         /// </reamrks>  
 82         public static Boolean IsCrc16Good(Byte[] FromHeadToCRC)
 83         {
 84             byte[] FromHeadToVaild = GetHeadToVaildData(FromHeadToCRC);     //頭到驗證域
 85             byte[] CRCFromPackage = GetCRCFromPackage(FromHeadToCRC);       //獲取客戶端傳來的包中的CRC數組   
 86             byte[] TrueCRCValue = GetCrc16(FromHeadToVaild);                //獲取客戶端傳來的包應該的CRC數組
 87             return BytesEquals(CRCFromPackage, TrueCRCValue);
 88         }
 89         /// <summary>
 90         /// 比較兩個字節數組是否相等
 91         /// </summary>
 92         /// <param name="b1">byte數組1</param>
 93         /// <param name="b2">byte數組2</param>
 94         /// <returns>是否相等</returns>
 95         private static bool BytesEquals(byte[] b1, byte[] b2)
 96         {
 97             if (b1.Length != b2.Length) return false;
 98             if (b1 == null || b2 == null) return false;
 99             for (int i = 0; i < b1.Length; i++)
100                 if (b1[i] != b2[i])
101                     return false;
102             return true;
103         }
104 
105 
106         /// <summary>
107         /// 獲取客戶端傳來的包中的CRC數組
108         /// </summary>
109         /// <param name="FromHeadToCRC">從頭到CRC校驗域</param>
110         /// <returns>CRC數組</returns>
111         private static byte[] GetCRCFromPackage(byte[] FromHeadToCRC)
112         {
113             int iCRCLen = 2;                                                             //因為CRC占兩個字節
114             byte[] CRCValue = new byte[iCRCLen];                                          //用于存儲包中CRC的值
115             int i;
116             for (i = 0; i < iCRCLen; i++)                                                 //得到一個臨時字節數組    
117             {
118                 CRCValue[i] = FromHeadToCRC[FromHeadToCRC.Length - iCRCLen + i];
119             }
120             return CRCValue;
121         }
122         /// <summary>
123         /// 得到從頭到有效數據的數據(不包含CRC驗證域)
124         /// </summary>
125         /// <param name="FromHeadToCRC"></param>
126         /// <returns></returns>
127         private static byte[] GetHeadToVaildData(byte[] FromHeadToCRC)
128         {
129             int iLengh = FromHeadToCRC.Length - 2;               //因為CRC占兩個字節
130             byte[] FromHeadToVaild = new byte[iLengh];       //用于存儲包頭到有效數據域的bytes
131             int i;
132             for (i = 0; i < iLengh; i++)                     //得到一個臨時字節數組    
133             {
134                 FromHeadToVaild[i] = FromHeadToCRC[i];
135             }
136             return FromHeadToVaild;
137 
138         }
139 
140     }
141 
142 }
C語言 CRC16代碼

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()