📄 xbytebuffer.java
字号:
* @return - true if a complete package (header,options,size,data,footer) exists within the buffer */ public boolean doesPackageExist() { return (countPackages()>0); } /** * Extracts the message bytes from a package. * If no package exists, a IllegalStateException will be thrown. * @param clearFromBuffer - if true, the package will be removed from the byte buffer * @return - returns the actual message bytes (header, compress,size and footer not included). */ public byte[] extractDataPackage(boolean clearFromBuffer) { int psize = countPackages(); if (psize == 0) throw new java.lang.IllegalStateException("No package exists in XByteBuffer"); int size = toInt(buf, START_DATA.length); byte[] data = new byte[size]; System.arraycopy(buf, START_DATA.length + 4, data, 0, size); if (clearFromBuffer) { int totalsize = START_DATA.length + 4 + size + END_DATA.length; bufSize = bufSize - totalsize; System.arraycopy(buf, totalsize, buf, 0, bufSize); } return data; } public ClusterData extractPackage(boolean clearFromBuffer) throws java.io.IOException { byte[] data = extractDataPackage(clearFromBuffer); ClusterData cdata = ClusterData.getDataFromPackage(data); return cdata; } /** * Creates a complete data package * @param indata - the message data to be contained within the package * @param compressed - compression flag for the indata buffer * @return - a full package (header,compress,size,data,footer) * */ public static byte[] createDataPackage(ClusterData cdata) { return createDataPackage(cdata.getDataPackage()); } public static int getDataPackageLength(int datalength) { int length = START_DATA.length + //header length 4 + //data length indicator datalength + //actual data length END_DATA.length; //footer length return length; } public static byte[] createDataPackage(byte[] data) { int length = getDataPackageLength(data.length); byte[] result = new byte[length]; return createDataPackage(data,0,data.length,result,0); } public static byte[] createDataPackage(byte[] data, int doff, int dlength, byte[] buffer, int bufoff) { if ( (buffer.length-bufoff) > getDataPackageLength(dlength) ) { throw new ArrayIndexOutOfBoundsException("Unable to create data package, buffer is too small."); } System.arraycopy(START_DATA, 0, buffer, bufoff, START_DATA.length); toBytes(data.length,buffer, bufoff+START_DATA.length); System.arraycopy(data, doff, buffer, bufoff+START_DATA.length + 4, dlength); System.arraycopy(END_DATA, 0, buffer, bufoff+START_DATA.length + 4 + data.length, END_DATA.length); return buffer; } public static void fillDataPackage(byte[] data, int doff, int dlength, XByteBuffer buf) { int pkglen = getDataPackageLength(dlength); if ( buf.getCapacity() < pkglen ) buf.expand(pkglen); createDataPackage(data,doff,dlength,buf.getBytesDirect(),buf.getLength()); } /** * Convert four bytes to an int * @param b - the byte array containing the four bytes * @param off - the offset * @return the integer value constructed from the four bytes * @exception java.lang.ArrayIndexOutOfBoundsException */ public static int toInt(byte[] b,int off){ return ( ( (int) b[off+3]) & 0xFF) + ( ( ( (int) b[off+2]) & 0xFF) << 8) + ( ( ( (int) b[off+1]) & 0xFF) << 16) + ( ( ( (int) b[off+0]) & 0xFF) << 24); } /** * Convert eight bytes to a long * @param b - the byte array containing the four bytes * @param off - the offset * @return the long value constructed from the eight bytes * @exception java.lang.ArrayIndexOutOfBoundsException */ public static long toLong(byte[] b,int off){ return ( ( (long) b[off+7]) & 0xFF) + ( ( ( (long) b[off+6]) & 0xFF) << 8) + ( ( ( (long) b[off+5]) & 0xFF) << 16) + ( ( ( (long) b[off+4]) & 0xFF) << 24) + ( ( ( (long) b[off+3]) & 0xFF) << 32) + ( ( ( (long) b[off+2]) & 0xFF) << 40) + ( ( ( (long) b[off+1]) & 0xFF) << 48) + ( ( ( (long) b[off+0]) & 0xFF) << 56); } /** * Converts an integer to four bytes * @param n - the integer * @return - four bytes in an array * @deprecated use toBytes(boolean,byte[],int) */ public static byte[] toBytes(boolean bool) { byte[] b = new byte[1] ; return toBytes(bool,b,0); } public static byte[] toBytes(boolean bool, byte[] data, int offset) { data[offset] = (byte)(bool?1:0); return data; } /** * * @param <any> long * @return use */ public static boolean toBoolean(byte[] b, int offset) { return b[offset] != 0; } /** * Converts an integer to four bytes * @param n - the integer * @return - four bytes in an array * @deprecated use toBytes(int,byte[],int) */ public static byte[] toBytes(int n) { return toBytes(n,new byte[4],0); } public static byte[] toBytes(int n,byte[] b, int offset) { b[offset+3] = (byte) (n); n >>>= 8; b[offset+2] = (byte) (n); n >>>= 8; b[offset+1] = (byte) (n); n >>>= 8; b[offset+0] = (byte) (n); return b; } /** * Converts an long to eight bytes * @param n - the long * @return - eight bytes in an array * @deprecated use toBytes(long,byte[],int) */ public static byte[] toBytes(long n) { return toBytes(n,new byte[8],0); } public static byte[] toBytes(long n, byte[] b, int offset) { b[offset+7] = (byte) (n); n >>>= 8; b[offset+6] = (byte) (n); n >>>= 8; b[offset+5] = (byte) (n); n >>>= 8; b[offset+4] = (byte) (n); n >>>= 8; b[offset+3] = (byte) (n); n >>>= 8; b[offset+2] = (byte) (n); n >>>= 8; b[offset+1] = (byte) (n); n >>>= 8; b[offset+0] = (byte) (n); return b; } /** * Similar to a String.IndexOf, but uses pure bytes * @param src - the source bytes to be searched * @param srcOff - offset on the source buffer * @param find - the string to be found within src * @return - the index of the first matching byte. -1 if the find array is not found */ public static int firstIndexOf(byte[] src, int srcOff, byte[] find){ int result = -1; if (find.length > src.length) return result; if (find.length == 0 || src.length == 0) return result; if (srcOff >= src.length ) throw new java.lang.ArrayIndexOutOfBoundsException(); boolean found = false; int srclen = src.length; int findlen = find.length; byte first = find[0]; int pos = srcOff; while (!found) { //find the first byte while (pos < srclen){ if (first == src[pos]) break; pos++; } if (pos >= srclen) return -1; //we found the first character //match the rest of the bytes - they have to match if ( (srclen - pos) < findlen) return -1; //assume it does exist found = true; for (int i = 1; ( (i < findlen) && found); i++) found = found && (find[i] == src[pos + i]); if (found) result = pos; else if ( (srclen - pos) < findlen) return -1; //no more matches possible else pos++; } return result; } public static Serializable deserialize(byte[] data) throws IOException, ClassNotFoundException, ClassCastException { return deserialize(data,0,data.length); } public static Serializable deserialize(byte[] data, int offset, int length) throws IOException, ClassNotFoundException, ClassCastException { return deserialize(data,offset,length,null); } public static int invokecount = 0; public static Serializable deserialize(byte[] data, int offset, int length, ClassLoader[] cls) throws IOException, ClassNotFoundException, ClassCastException { synchronized (XByteBuffer.class) { invokecount++;} Object message = null; if ( cls == null ) cls = new ClassLoader[0]; if (data != null) { InputStream instream = new ByteArrayInputStream(data,offset,length); ObjectInputStream stream = null; stream = (cls.length>0)? new ReplicationStream(instream,cls):new ObjectInputStream(instream); message = stream.readObject(); instream.close(); stream.close(); } if ( message == null ) { return null; } else if (message instanceof Serializable) return (Serializable) message; else { throw new ClassCastException("Message has the wrong class. It should implement Serializable, instead it is:"+message.getClass().getName()); } } /** * Serializes a message into cluster data * @param msg ClusterMessage * @param compress boolean * @return * @throws IOException */ public static byte[] serialize(Serializable msg) throws IOException { ByteArrayOutputStream outs = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(outs); out.writeObject(msg); out.flush(); byte[] data = outs.toByteArray(); return data; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -