zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

JAVAc#循环 16 检验 冗余 CRC 查表
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文件配置如下: