C#,Java,C -循环冗余检验:CRC-16-CCITT查表法

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代码

 

posted @ 2013-09-26 20:27  陈哈哈  阅读(10327)  评论(1编辑  收藏  举报