文章出處
C# CRC16代碼
Java CRC16代碼
C語言 CRC16代碼
文章列表
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 }
文章列表
全站熱搜