154 lines · 2.8 KB · Java
RawDownload
package plan9.lib; // from styx-n-9p.googlecode.com, MIT licence import java.lang.*;import java.util.Arrays;import java.nio.ByteBuffer; public class Packer { 	byte[]	data;	int	o0;	// initial offset	int	o; 	public Packer(int n){		o = o0 = 0;		data = new byte[n];	}	public Packer(byte[] a){		o = o0 = 0;		data = a;	}	public Packer(byte[] a, int offset){		o = o0 = offset;		data = a;	}	public void restart(){		o = o0;	}	public int length(){		return o-o0;	}	public ByteBuffer buffer(){		return ByteBuffer.wrap(data, o0, length());	}	public byte[] array(){		return data;	}	public int offset(){		return o;	} 	public byte get(){		return data[o++];	}	public int get1(){		return (int)data[o++] & 0xFF;	}	public int get2(){		int v;		v = (int)data[o+0] & 0xFF;		v |= ((int)data[o+1] & 0xFF)<<8;		o += 2;		return v;	}	public int get4(){		int v; 		v = (int)data[o+0] & 0xFF;		v |= ((int)data[o+1] & 0xFF)<<8;		v |= ((int)data[o+2] & 0xFF)<<16;		v |= ((int)data[o+3] & 0xFF)<<24;		o += 4;		return v;	}	public long get8(){		long n0 = (long)get4() & 0xFFFFFFFFL;		return ((long)get4() << 32) | n0;	}	public byte[] geta(int n){		byte[] a = new byte[n];		System.arraycopy(data, o, a, 0, n);		o += n;		return a;	} 	public final void put(byte b){		data[o++] = b;	}	public final void put1(int v){		data[o++] = (byte)(v & 0xFF);	}	public final void put2(int v){		data[o+0] = (byte)(v);		data[o+1] = (byte)(v>>8);		o += 2;	}	public final void put4(int v){		data[o+0] = (byte)v;		data[o+1] = (byte)(v>>8);		data[o+2] = (byte)(v>>16);		data[o+3] = (byte)(v>>24);		o += 4;	}	public final void put8(long v){		data[o+0] = (byte)v;		data[o+1] = (byte)(v>>8);		data[o+2] = (byte)(v>>16);		data[o+3] = (byte)(v>>24);		data[o+4] = (byte)(v>>32);		data[o+5] = (byte)(v>>40);		data[o+6] = (byte)(v>>48);		data[o+7] = (byte)(v>>56);		o += 8;	} 	public final void puta(byte[] a, int n){		if(a != null && a.length != 0){			int l = a.length < n? a.length: n;			System.arraycopy(a, 0, data, o, l);			o += l;			n -= l;		}		if(n > 0){			Arrays.fill(data, o, o+n, (byte)0);			o += n;		}	}	public final void puta(byte[] a){	// a must not be null		puta(a, a.length);	} 	public final String gets(int n){	// fixed-length string with null byte		try{			int o1 = o;			o += n;			if(n > 0)				n--;	// must have null byte			for(int i = 0; i < n; i++){				if(data[o1+i] == (byte)0){					n = i;					break;				}			}			return new String(data, o1, n, "UTF-8");		}catch(java.io.UnsupportedEncodingException e){			return "Egosling";		}	} 	public final void puts(String s){	// string with explicit count		if(s == null || s.length() == 0){			put2(0);			return;		}		byte[] a = Strings.bytes(s);		put2(a.length);		puta(a, a.length);	} 	public final void puts(String s, int n) {	// string as fixed array		puta(Strings.bytes(s), n);	}}