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 }
复制代码

 

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 }
复制代码

 

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 }
复制代码

 


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3341461.html

目录
相关文章
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
638 19
C#与Java
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
678 4
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
422 2
|
Java C#
C# 和 java 基本数据类型
C# 和 java 基本数据类型
207 0
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
328 0
JAVA单例模式-双重检验锁(防止反射、序列化多个)
JAVA单例模式-双重检验锁(防止反射、序列化多个)
203 1
|
Java C# 数据安全/隐私保护
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
745 3
|
运维 数据挖掘 C#
C#大型LIS检验信息系统项目源码
LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地看到患者的检验结果。
369 0
|
数据采集 开发框架 监控
C# ASP.NET 实验室 检验中心 医疗LIS源码
LIS系统整体流程 检验项目申请:医生通过HIS或者病历系统开具检验项目检验申请单(内容包括病人信息及检验项目),申请信息自动传到护士站。如果不和HIS和病历系统对接,可以通过LIS系统自身的检验申请模块,实现申请单电子化,申请信息自动传到护士站。
235 0