// (c) Copyright 2000 Justin F. Chapweske
// (c) Copyright 2000 Ry4an C. Brase
package com.onionnetworks.util;
/**
* A class (struct) for holding the offset and length of a byte[] buffer
*
*@author Justin F. Chapweske
*/
public class Buffer {
public byte[] b;
public int off;
public int len;
public Buffer(int len) {
this(new byte[len]);
}
public Buffer(byte[] b) {
this(b,0,b.length);
}
public Buffer(byte[] b, int off, int len) {
if (len < 0 || off < 0 || off+len > b.length) {
throw new ArrayIndexOutOfBoundsException("b.length="+b.length+
",off="+off+",len="+len);
}
this.b = b;
this.off = off;
this.len = len;
}
/**
* Calling this defeats the purpose of reusing byte arrays, so only
* call this when you have to get a byte[].
*/
public byte[] getBytes() {
byte[] retval = new byte[len];
System.arraycopy(b, off, retval, 0, len);
return retval;
}
/**
* If two buffers are the same length and contain the same data, then this
* method will return true, otherwise false.
*/
public boolean equals(Object o) {
if (o instanceof Buffer) {
Buffer buf = (Buffer) o;
if (buf.len != len) {
return false;
}
for (int i=0;i<len;i++) {
if (buf.b[buf.off+i] != b[off+i]) {
return false;
}
}
return true;
} else {
return false;
}
}
/**
* Uncomment this if you're not a coward.
* /
public int hashCode() {
int retval = 0;
for (int i=0;i<len;i++) {
retval |= ((int)(b[off+i])) << (8 * (i & 4));
}
return retval;
}
*/
public String toString() {
StringBuffer rep = new StringBuffer("Buffer{length: "+len+"; offset: "+off+"; ");
for (int i = off; i<len; i++) {
rep.append(""+i+": "+b[i]);
if (i != len-1) rep.append(", ");
}
rep.append("}");
return rep.toString();
}
}