package javaforce;
/**
* Big Endian get/set functions.
*
* Usage : network packets, Motorola CPU style, etc.
*
* Could use java.nio.ByteBuffer but sometimes this is faster.
*
* Created : Dec 5, 2013
*/
import java.nio.*;
public class BE {
public static int getuint8(byte[] data, int offset) {
return ((int)data[offset]) & 0xff;
}
public static int getuint16(byte[] data, int offset) {
int ret;
ret = ((int) data[offset] & 0xff) << 8;
ret += ((int)data[offset + 1]) & 0xff;
return ret;
}
public static int getuint32(byte[] data, int offset) {
int ret;
ret = ((int) data[offset] & 0xff) << 24;
ret += ((int) data[offset + 1] & 0xff) << 16;
ret += ((int) data[offset + 2] & 0xff) << 8;
ret += ((int) data[offset + 3] & 0xff);
return ret;
}
public static long getuint64(byte[] data, int offset) {
long ret;
ret = ((long) data[offset] & 0xff) << 56;
ret += ((long) data[offset + 1] & 0xff) << 48;
ret += ((long) data[offset + 2] & 0xff) << 40;
ret += ((long) data[offset + 3] & 0xff) << 32;
ret += ((long) data[offset + 4] & 0xff) << 24;
ret += ((long) data[offset + 5] & 0xff) << 16;
ret += ((long) data[offset + 6] & 0xff) << 8;
ret += ((long) data[offset + 7] & 0xff);
return ret;
}
public static void setuint8(byte data[], int offset, int value) {
data[offset+0] = (byte)(value & 0xff);
}
public static void setuint16(byte data[], int offset, int value) {
data[offset+1] = (byte)(value & 0xff);
value >>= 8;
data[offset+0] = (byte)(value & 0xff);
}
public static void setuint32(byte data[], int offset, int value) {
data[offset+3] = (byte)(value & 0xff);
value >>= 8;
data[offset+2] = (byte)(value & 0xff);
value >>= 8;
data[offset+1] = (byte)(value & 0xff);
value >>= 8;
data[offset+0] = (byte)(value & 0xff);
}
public static void setuint64(byte data[], int offset, long value) {
data[offset+7] = (byte)(value & 0xff);
value >>= 8;
data[offset+6] = (byte)(value & 0xff);
value >>= 8;
data[offset+5] = (byte)(value & 0xff);
value >>= 8;
data[offset+4] = (byte)(value & 0xff);
value >>= 8;
data[offset+3] = (byte)(value & 0xff);
value >>= 8;
data[offset+2] = (byte)(value & 0xff);
value >>= 8;
data[offset+1] = (byte)(value & 0xff);
value >>= 8;
data[offset+0] = (byte)(value & 0xff);
}
//these funcs are no different (just conv functions)
public static String getString(byte data[], int offset, int len) {
return LE.getString(data, offset, len);
}
public static void setString(byte data[], int offset, int len, String str) {
LE.setString(data, offset, len, str);
}
//Using arrays are 40% faster than using java.nio.ByteBuffer
public static short[] byteArray2shortArray(byte in[], short out[]) {
int len = in.length / 2;
if (out == null) out = new short[len];
int p = 0;
short val;
for (int a = 0; a < len; a++) {
val = (short)((((short)in[p++]) & 0xff) << 8);
val += (((short)in[p++]) & 0xff);
out[a] = val;
}
return out;
}
public static int[] byteArray2intArray(byte in[], int out[]) {
int len = in.length / 4;
if (out == null) out = new int[len];
int p = 0;
int val;
for (int a = 0; a < len; a++) {
val = (((int)in[p++]) & 0xff) << 24;
val += (((int)in[p++]) & 0xff) << 16;
val += (((int)in[p++]) & 0xff) << 8;
val += (((int)in[p++]) & 0xff);
out[a] = val;
}
return out;
}
public static byte[] shortArray2byteArray(short in[], byte out[]) {
int len = in.length;
if (out == null) out = new byte[len * 2];
int p = 0;
short val;
for (int a = 0; a < len; a++) {
val = in[a];
out[p++] = (byte) ((val & 0xff00) >>> 8);
out[p++] = (byte) (val & 0xff);
}
return out;
}
public static byte[] intArray2byteArray(int in[], byte out[]) {
int len = in.length;
if (out == null) out = new byte[len * 4];
int p = 0;
int val;
for (int a = 0; a < len; a++) {
val = in[a];
out[p++] = (byte) ((val & 0xff000000) >>> 8);
out[p++] = (byte) ((val & 0xff0000) >> 8);
out[p++] = (byte) ((val & 0xff00) >> 8);
out[p++] = (byte) (val & 0xff);
}
return out;
}
}