package javaforce; /** * Little Endian get/set functions. * * Usage : Windows files, Intel CPU style, etc. * * Could use java.nio.ByteBuffer but sometimes this is faster. * * Created : Dec 5, 2013 */ public class LE { public static int getuint8(byte[] data, int offset) { int ret; ret = (int)data[offset] & 0xff; return ret; } public static int getuint16(byte[] data, int offset) { int ret; ret = data[offset] & 0xff; ret += (data[offset+1] & 0xff) << 8; return ret; } public static int getuint32(byte[] data, int offset) { int ret; ret = (int)data[offset] & 0xff; ret += ((int)data[offset+1] & 0xff) << 8; ret += ((int)data[offset+2] & 0xff) << 16; ret += ((int)data[offset+3] & 0xff) << 24; return ret; } public static long getuint64(byte[] data, int offset) { long ret; ret = (long)data[offset] & 0xff; ret += ((long)data[offset+1] & 0xff) << 8; ret += ((long)data[offset+2] & 0xff) << 16; ret += ((long)data[offset+3] & 0xff) << 24; ret += ((long)data[offset+4] & 0xff) << 32; ret += ((long)data[offset+5] & 0xff) << 40; ret += ((long)data[offset+6] & 0xff) << 48; ret += ((long)data[offset+7] & 0xff) << 56; return ret; } public static String getString(byte[] data, int offset, int len) { String ret = ""; while (len > 0) { if (data[offset]==0) break; ret += (char)data[offset++]; len--; } return ret; } public static void setuint8(byte[] data, int offset, int num) { data[offset] = (byte)(num & 0xff); } public static void setuint16(byte[] data, int offset, int num) { data[offset+0] = (byte)(num & 0xff); num >>= 8; data[offset+1] = (byte)(num & 0xff); } public static void setuint32(byte[] data, int offset, int num) { data[offset+0] = (byte)(num & 0xff); num >>= 8; data[offset+1] = (byte)(num & 0xff); num >>= 8; data[offset+2] = (byte)(num & 0xff); num >>= 8; data[offset+3] = (byte)(num & 0xff); } public static void setuint64(byte[] data, int offset, long num) { data[offset+0] = (byte)(num & 0xff); num >>= 8; data[offset+1] = (byte)(num & 0xff); num >>= 8; data[offset+2] = (byte)(num & 0xff); num >>= 8; data[offset+3] = (byte)(num & 0xff); num >>= 8; data[offset+4] = (byte)(num & 0xff); num >>= 8; data[offset+5] = (byte)(num & 0xff); num >>= 8; data[offset+6] = (byte)(num & 0xff); num >>= 8; data[offset+7] = (byte)(num & 0xff); } public static void setString(byte[] data, int offset, int len, String str) { int pos = 0; while (len > 0) { if (pos >= str.length()) { data[offset++] = 0; } else { data[offset++] = (byte)str.charAt(pos++); } len--; } } //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)(in[p++] & 0xff); val += (in[p++] & 0xff) << 8; 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 = (in[p++] & 0xff); val += (in[p++] & 0xff) << 8; val += (in[p++] & 0xff) << 16; val += (in[p++] & 0xff) << 24; 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 & 0xff); out[p++] = (byte) (val >>> 8); } 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 & 0xff); val >>>= 8; out[p++] = (byte) (val & 0xff); val >>>= 8; out[p++] = (byte) (val & 0xff); out[p++] = (byte) (val >>> 8); } return out; } }