package cn.sigangjun.connect.base.util; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; import cn.sigangjun.connect.base.CMD; import cn.sigangjun.connect.base.bean.BeanUtils; import cn.sigangjun.connect.base.exception.CMDException; public class CMDUtil { public static int GetIntValueFromBytes(byte[] bytes, int offset, int length) { int value = 0; if (length > 4) return -1; if (length + offset > bytes.length) { return -1; } for (int i = 0; i < length; i++) { int n = (char) bytes[(i + offset)]; value |= n << (length - i - 1) * 8; } return value; } public static long GetLongValueFromBytes(byte[] bytes, int offset, int length) { long value = 0; if (length > 4) return -1; if (length + offset > bytes.length) { return -1; } for (int i = 0; i < length; i++) { int n = (char) bytes[(i + offset)]; value |= n << (length - i - 1) * 8; } return value; } public static String GetStringFromBytes(byte[] bytes, int offset, int length) { return new String(bytes, offset, length); } public static byte[] GetBytesFromBytes(byte[] bytes, int offset, int length) { if (length + offset > bytes.length) return null; byte[] desBytes = new byte[length]; for (int i = 0; i < length; i++) { desBytes[i] = bytes[(i + offset)]; } return desBytes; } public static byte[] GetBytesFromInt(int value, int length) { byte[] bytes = new byte[length]; for (int i = 0; i < length; i++) { bytes[i] = (byte) (value >> (length - i - 1) * 8 & 0xFF); } return bytes; } public static boolean SetBytesFromLong(byte[] bytes, int offset, int length, long value) { if (offset + length > bytes.length) { return false; } for (int i = 0; i < length; i++) { bytes[(i + offset)] = (byte) (int) (value >> (length - i - 1) * 8 & 0xFF); } return true; } public static boolean SetBytesFromString(byte[] bytes, int offset, int length, String str) { byte[] b = str.getBytes(); if (offset + b.length > bytes.length) return false; return SetBytesFromBytes(bytes, offset, b, length); } public static boolean SetBytesFromBytes(byte[] bDes, int offset, byte[] bSource) { if (bSource == null) bSource = new byte[0]; return SetBytesFromBytes(bDes, offset, bSource, bSource.length); } public static boolean SetBytesFromBytes(byte[] bDes, int offset, byte[] bSource, int length) { if (offset + length > bDes.length) { return false; } for (int i = 0; i < bSource.length; i++) { bDes[(i + offset)] = bSource[i]; } if (length > bSource.length) { for (int i = bSource.length; i < length; i++) { bDes[(i + offset)] = 0; } } return true; } public static void printBytes(byte[] bytes) { System.out.println("=============================收到的二进制流======================================="); for (byte b : bytes) { int i = (int)b&0xFF; String hou = Integer.toBinaryString(i); if(hou.length()<8){ String qian = ""; for(int ii=0;ii<8-hou.length();ii++) { qian+="0"; } hou =qian + hou; } System.out.print(hou); } System.out.println(); System.out.println(); System.out.println("=============================转成字节======================================="); for (byte b : bytes) { int i = (char)b&0xFF; System.out.print(i + ","); } System.out.println(); System.out.println(); System.out.println(); System.out.println(); } @SuppressWarnings("static-access") public static <T> byte[] getBytes(Class<T> clazz, T model) { byte[] returnbytes = null; try { Field[] fields = clazz.getDeclaredFields(); int bytes_length = 0; for (Field f : fields) { CMD ano = f.getAnnotation(CMD.class); if (ano != null) { bytes_length = bytes_length + ano.length(); } } byte[] bytes = new byte[bytes_length]; int offset = 0; int length = 0; for (Field f : fields) { CMD ano = f.getAnnotation(CMD.class); if (ano != null) { length = ano.length(); Class<?> type = f.getType(); if (type == String.class) { CMDUtil.SetBytesFromString(bytes, offset, length, BeanUtils.getProperty(model, f.getName())); } else if (type == Integer.class) { CMDUtil.SetBytesFromLong(bytes, offset, length, BeanUtils.getProperty(model, f.getName(),Integer.class)); } else if (type == Date.class) { CMDUtil.SetBytesFromLong(bytes, offset, length, BeanUtils.getProperty(model, f.getName(),Date.class).getTime()); } offset = length + offset; } } Method method3 = clazz.getSuperclass().getDeclaredMethod("toBytes", byte[].class); method3.setAccessible(true); returnbytes = (byte[]) method3.invoke(model, bytes); } catch (Exception e) { e.printStackTrace(); } return returnbytes; } @SuppressWarnings("static-access") public static <T> T getModel(Class<T> clazz, byte[] bytes) throws CMDException, Exception { T t = null; Field[] fields = clazz.getDeclaredFields(); try { t = clazz.getConstructor(byte[].class).newInstance(bytes); } catch (InvocationTargetException e) { Throwable throwable = e.getTargetException(); throw (CMDException) throwable; } Method method32 = clazz.getSuperclass().getDeclaredMethod("getDataSend"); method32.setAccessible(true); byte[] data = (byte[]) method32.invoke(t); int offset = 0; int length = 0; for (Field f : fields) { CMD ano = f.getAnnotation(CMD.class); if (ano != null) { length = ano.length(); Class<?> type = f.getType(); if (type == String.class) { BeanUtils.setProperty(t, f.getName(), CMDUtil.GetStringFromBytes(data, offset, length)); } else if (type == Integer.class) { BeanUtils.setProperty(t, f.getName(), CMDUtil.GetIntValueFromBytes(data, offset, length)); } else if (type == Date.class) { BeanUtils.setProperty(t, f.getName(), new Date(CMDUtil.GetLongValueFromBytes(data, offset, length))); } offset = length + offset; } } return t; } }
原文:http://blog.csdn.net/sigangjun/article/details/23461617