package net.i2p.data;
/*
* free (adj.): unencumbered; not under the control of others
* Written by jrandom in 2003 and released into the public domain
* with no warranty of any kind, either expressed or implied.
* It probably won't make your computer catch on fire, or eat
* your children, but it might. Use at your own risk.
*
*/
import java.io.Serializable;
/**
* Wrap up an array of bytes so that they can be compared and placed in hashes,
* maps, and the like.
*
*/
public class ByteArray implements Serializable, Comparable<ByteArray> {
private byte[] _data;
private int _valid;
private int _offset;
public ByteArray() {
}
/**
* Sets valid = data.length, unless data is null
* Sets offset = 0
* @param data may be null
*/
public ByteArray(byte[] data) {
_data = data;
_valid = (data != null ? data.length : 0);
}
/**
* Sets offset = offset
* Sets valid = length
* @param data may be null but why would you do that
*/
public ByteArray(byte[] data, int offset, int length) {
_data = data;
_offset = offset;
_valid = length;
}
public byte[] getData() {
return _data;
}
/** Warning, does not set valid */
public void setData(byte[] data) {
_data = data;
}
/**
* Count how many of the bytes in the array are 'valid'.
* this property does not necessarily have meaning for all byte
* arrays.
*/
public int getValid() { return _valid; }
public void setValid(int valid) { _valid = valid; }
public int getOffset() { return _offset; }
public void setOffset(int offset) { _offset = offset; }
@Override
public final boolean equals(Object o) {
if (o == this) return true;
if (o == null) return false;
if (o instanceof ByteArray) {
ByteArray ba = (ByteArray)o;
return compare(getData(), _offset, _valid, ba.getData(), ba.getOffset(), ba.getValid());
}
try {
byte val[] = (byte[]) o;
return compare(getData(), _offset, _valid, val, 0, val.length);
} catch (Throwable t) {
return false;
}
}
private static final boolean compare(byte[] lhs, int loff, int llen, byte[] rhs, int roff, int rlen) {
return (llen == rlen) && DataHelper.eq(lhs, loff, rhs, roff, llen);
}
public final int compareTo(ByteArray ba) {
return DataHelper.compareTo(_data, ba.getData());
}
@Override
public final int hashCode() {
return DataHelper.hashCode(getData());
}
@Override
public String toString() {
return super.toString() + "/" + DataHelper.toString(getData(), 32) + "." + _valid;
}
public final String toBase64() {
return Base64.encode(_data, _offset, _valid);
}
}