• 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代码
  • 相关阅读:
    Anniversary party
    1358. 分割树
    我在 impress.js 中学到的小套路
    我对 impress.js 源码的理解
    CSS transition 过渡 详解
    CSS 2D转换 matrix() 详解
    JS 动画基础
    JS 瀑布流布局
    JS 下拉菜单
    JS Resizable Panel 练习
  • 原文地址:https://www.cnblogs.com/kissazi2/p/3341461.html
Copyright © 2020-2023  润新知