C#,Java,C -循环冗余检验:CRC-16-CCITT查表法
2023-09-14 09:00:57 时间
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 6 namespace TestCRC 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 } 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 } 60 return (High == 0xF0 Low == 0xB8); 61 } 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 }; 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 }
1 import com.example.utils.BitConverter; 5 /** 6 * 循环冗余检验:CRC-16-CCITT查表法 7 */ 8 public final class CRC16 { 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 } 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 } 55 return (High == 0xF0 Low == 0xB8); 56 } 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 }; 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 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 6 namespace GovConsoleSuperior.Common 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 i++) 23 { 24 int by = (crc 8) 0xff; 25 crc = (crc 0xffff) 8; 26 crc = (crc ^ table[(buffer[i] ^ by) 0xff]) 0xffff; 27 } 29 return GetCRCBytes(crc); 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字节 42 return result; 43 } 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 }; 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 } 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; 138 } 140 } 142 }
作者:kissazi2
出处:http://www.cnblogs.com/kissazi2/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载:http://www.cnblogs.com/kissazi2/p/3341461.html
Java-实现文件sha1编码获取 SHA-1是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全。
Java-实现文件的MD5编码获取 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
Java的3种Base64加密方法 , 分别是 jdk默认实现的加密方式, 使用cc的加密方式和使用bc的加密方式 import java.io.IOException; import org.
MD5 in JAVA using Apache Commons 需要引入org.apache.commons.codec.digest.DigestUtils这个包,pom.xml文件配置如下:
相关文章
- Java系统日志管理「建议收藏」
- fileinputstream java_Java FileInputStream close()方法
- java 调用.asmx_Java调用asmx的一个例子
- java locale 中国_Java描述语言、国家和地理的类——Locale
- java 异步调用接口_Java接口异步调用[通俗易懂]
- java语言的平台无关性是指什么,《深入Java虚拟机》学习笔记二:平台无关性
- 安卓java游戏模拟器_Java手机游戏模拟器
- java实现ajax_Ajax&Java
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- 【说站】java中jstack是什么
- Java数组循环_java遍历object数组
- java输出一个数组的元素_Java输出数组元素「建议收藏」
- java arraydeque poll,Java ArrayDeque「建议收藏」
- c# 多线程并发-金三银四面试:C#.NET面试题高级篇2-多线程
- java家装网装修网站装修系统源码
- java中的日期类
- java获取当前上一周、上一月、上一年的时间等等详解编程语言
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型详解编程语言
- MySQL数据库开发实践:用 Java 开发中文应用(mysql中文java)
- 服务器使用Java进行Linux服务器监控(java监控linux)
- 学习Linux,开启Java之旅(linuxjavaws)
- 环境的基础Linux:Java环境的支撑者(linux是java)
- 设置Redis实现Java中过期设置的技术实现(redisjava过期)
- Java中使用Redis包实现高效缓存(redis包java)
- 使用Java轻松导出MySQL数据(java导出mysql)
- Learn How to Connect Your Java Application with MongoDB in Just a Few Steps(java连接mongodb)
- Java Redis一次实现无限数据加速的尝试(用java redis)
- Java消息处理实践突破性技术Redis(redis消息 java)
- 用Java实现FTP服务器解决方案
- Java正则多字符串匹配替换
- java字符串与格式化输出的深入分析
- java类加载器和类反射使用示例
- Java集合Set、List、Map的遍历方法