package com.cgcl.cloudesk.manage.util; import java.io.UnsupportedEncodingException; public class Serializer { /** * Serializes boolean to buf * @param buf byte array that serialize to * @param offset start point of buf * @param b boolean that serialize from * @return serialized length */ public static int serialize(byte[] buf, int offset, boolean b) { if(b) { serialize(buf, offset, (byte)1); } else { serialize(buf, offset, (byte)0); } return 1; } /** * Deserializes a boolean from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return boolean deserialized from buf */ public static boolean deserializeBoolean(byte[] buf, int offset) { byte b = deserializeByte(buf, offset); if(0 != b) { return true; } else { return false; } } /** * Serializes byte to buf * @param buf byte array that serialize to * @param offset start point of buf * @param b byte that serialize from * @return serialized length */ public static int serialize(byte[] buf, int offset, byte b) { buf[offset++] = b; return 1; } /** * Deserializes a byte from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return byte deserialized from buf */ public static byte deserializeByte(byte[] buf, int offset) { byte b = (byte)0; b = buf[offset]; return b; } /** * Serializes char to buf * @param buf byte array that serialize to * @param offset start point of buf * @param c char that serialize from * @return serialized length */ public static int serialize(byte[] buf, int offset, char c) { buf[offset++] = (byte)c; buf[offset++] = (byte)(c >> 8); return 2; } /** * Deserializes a char from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return char deserialized from buf */ public static char deserializeChar(byte[] buf, int offset) { char c = (char)0; c += buf[offset + 1] & 0xff; c <<= 8; c += buf[offset] & 0xff; return c; } /** * Serialize short to buf * @param buf byte array that serialize to * @param offset start point if buf * @return serialized length */ public static int serialize(byte[] buf, int offset, short n) { buf[offset++] = (byte)n; buf[offset++] = (byte)(n >> 8); return 2; } /** * Deserialize a short from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return short desrtialize from buf */ public static short deserializeShort(byte[] buf, int offset) { short n = 0; n += buf[offset + 1] & 0xff; n <<= 8; n += buf[offset] & 0xff; return n; } /** * Serializes int to buf * @param buf byte array that serialize to * @param offset start point of buf * @param n int that serialize from * @return serialized length */ public static int serialize(byte[] buf, int offset, int n) { buf[offset++] = (byte)n; buf[offset++] = (byte)(n >> 8); buf[offset++] = (byte)(n >> 16); buf[offset++] = (byte)(n >> 24); return 4; } /** * Deserialize an int from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return int deserialized from buf */ public static int deserializeInt(byte[] buf, int offset) { int n = 0; n += buf[offset + 3] & 0xff; n <<= 8; n += buf[offset + 2] & 0xff; n <<= 8; n += buf[offset + 1] & 0xff; n <<= 8; n += buf[offset] & 0xff; return n; } /** * Serializes byte array to buf * @param buf byte array that serialize to * @param offset start point of buf * @param array byte array that serialize from * @param arrayOffset start point of array * @param arrayLen serialized length * @return serialized length */ public static int serialize(byte[] buf, int offset, byte[] array, int arrayOffset, int arrayLen) { System.arraycopy(array, arrayOffset, buf, offset, arrayLen); return arrayLen; } /** * Deserializes byte array from buf * @param buf byte array that deserialize from * @param offset start point of buf * @param array byte array that deserialize to * @param arrayOffset start point of array * @param arrayLen deserialized length * @return deserialized length */ public static int deserialize(byte[] buf, int offset, byte[] array, int arrayOffset, int arrayLen) { System.arraycopy(buf, offset, array, arrayOffset, arrayLen); return arrayLen; } /** * Serializes byte array to buf * @param buf byte array that serialize to * @param offset start point of buf * @param array byte array that serialize from * @return array's length */ public static int serialize(byte[] buf, int offset, byte[] array) { return serialize(buf, offset, array, 0, array.length); } /** * Deserializes byte array from buf * @param buf byte array that deserialize from * @param offset start point of buf * @param array byte array that deserialize to * @return array's length */ public static int deserialize(byte[] buf, int offset, byte[] array) { return deserialize(buf, offset, array, 0, array.length); } /** * Serializes String to buf * @param buf byte array that serialize to * @param offset start point of buf * @param str String that serialize from * @return serialized length */ public static int serialize(byte[] buf, int offset, String str) { int len = 0; try { len += serialize( buf, offset + len, str.getBytes("gb2312").length ); len += serialize( buf, offset + len, str.getBytes("gb2312") ); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return len; } /** * Deserializes String from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return String deserialized from buf */ public static String deserializeString(byte[] buf, int offset) { int len = 0; int strLen = deserializeInt(buf, offset + len); len += 4; byte[] tmpBuf = new byte[strLen]; len += deserialize(buf, offset + len, tmpBuf); try { String ret = new String(tmpBuf, "GB2312"); return ret; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * Serializes byte array to buf with the size in the front * @param buf byte array that serialize to * @param offset start point of buf * @param byteArray byte array that serialize from * @return serialized length */ public static int serializeByteArray(byte[] buf, int offset, byte[] byteArray) { int len = 0; if(null != byteArray) { len += serialize(buf, offset + len, byteArray.length); len += serialize(buf, offset + len, byteArray); } else { len += serialize(buf, offset + len, 0); } return len; } /** * Deserializes byte array from buf * @param buf byte array that deserialize from * @param offset start point of buf * @return byte[] deserialized from buf */ public static byte[] deserializeByteArray(byte[] buf, int offset) { byte[] byteArray = null; int len = 0; int byteArrayLen = deserializeInt(buf, offset + len); len += 4; if(0 != byteArrayLen) { byteArray = new byte[byteArrayLen]; len += deserialize(buf, offset + len, byteArray); } return byteArray; } /** * Gets the length of boolean * @param b * @return 1 */ public static int length(boolean b) { return 1; } /** * Gets the length of serialized str * @param str String that serialize from * @return length of serialized str */ public static int length(String str) { int len = 0; len += 4; try { len += str.getBytes("GB2312").length; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return len; } /** * Gets the length of serialized byteArray * @param byteArray byte array that serialize from * @return length of serialized byteArray */ public static int length(byte[] byteArray) { int len = 0; len += 4; if(null != byteArray) { len += byteArray.length; } return len; } }