/*
* JGrass - Free Open Source Java GIS http://www.jgrass.org
* (C) HydroloGIS - www.hydrologis.com
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Library General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option) any
* later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
* details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jgrasstools.gears.io.dxfdwg.libs.dwg;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Vector;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.utils.ByteUtils;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.utils.HexUtil;
/**
* The DwgUtil class contains the essential set of functions for reading bitstreams
* in DWG files
*
* @author jmorell
*/
public final class DwgUtil {
/**
* Read the extended data for a DWG object
* Don't use in this version. Serious bugs detected
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the extended data of a DWG object
*/
public static Vector readExtendedData(int[] data, int offset) throws Exception {
int bitPos = offset;
Vector extData = new Vector();
while (true) {
int newBitPos = ((Integer)getBitShort(data, bitPos).get(0)).intValue();
int size = ((Integer)getBitShort(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
if (size==0) {
break;
}
newBitPos = ((Integer)((Vector)getHandle(data, bitPos)).get(0)).intValue();
// TODO: Esto no es correcto. Repasar ...
int handle = ((Integer)((Vector)getHandle(data, bitPos)).get(1)).intValue();
bitPos = newBitPos;
Vector eedata = new Vector();
while (size>0) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int cb = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
size = size-1;
if (cb==0x0) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int len = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
newBitPos = ((Integer)getRawShort(data, bitPos).get(0)).intValue();
int cp = ((Integer)getRawShort(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
Vector chars = new Vector();
for (int i=0; i<len; i++) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int charr = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
// int o char?
chars.add(new Integer(charr));
}
// Incorrecto. Repasar ...
eedata.add(chars);
size = size-len-3;
} else if (cb==0x1) {
System.out.println("Invalid EXX code byte: 0x1");
} else if (cb==0x2) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int charr = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
if (charr==0x0) {
eedata.add("{");
} else if (charr==0x1) {
eedata.add("}");
} else {
System.out.println("Unexpected EXX char: " + charr);
}
size = size - 1;
} else if (cb==0x3 || cb==0x5) {
Vector chars = new Vector();
for (int i=0; i<8; i++) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int charr = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
chars.add(new Integer(charr));
}
eedata.add(chars);
size = size - 8;
} else if (cb==0x4) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int len = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
Vector chars = new Vector();
for (int i=0; i<len; i++) {
newBitPos = ((Integer)getRawChar(data, bitPos).get(0)).intValue();
int charr = ((Integer)getRawChar(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
chars.add(new Integer(charr));
}
eedata.add(chars);
size = size - len -1;
} else if (0xa<=cb && cb<=0xd) {
newBitPos = ((Integer)((Vector)getRawDouble(data, bitPos)).get(0)).intValue();
double d1 = ((Double)((Vector)getRawDouble(data, bitPos)).get(1)).doubleValue();
bitPos = newBitPos;
newBitPos = ((Integer)((Vector)getRawDouble(data, bitPos)).get(0)).intValue();
double d2 = ((Double)((Vector)getRawDouble(data, bitPos)).get(1)).doubleValue();
bitPos = newBitPos;
newBitPos = ((Integer)((Vector)getRawDouble(data, bitPos)).get(0)).intValue();
double d3 = ((Double)((Vector)getRawDouble(data, bitPos)).get(1)).doubleValue();
bitPos = newBitPos;
eedata.add(new double[]{d1, d2, d3});
size = size - 24;
} else if (0x28<=cb && cb<=0x2a) {
newBitPos = ((Integer)((Vector)getRawDouble(data, bitPos)).get(0)).intValue();
double d = ((Double)((Vector)getRawDouble(data, bitPos)).get(1)).doubleValue();
bitPos = newBitPos;
eedata.add(new Double(d));
size=size-8;
} else if (cb==0x46) {
newBitPos = ((Integer)getRawShort(data, bitPos).get(0)).intValue();
int shortt = ((Integer)getRawShort(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
eedata.add(new Integer(shortt));
size=size-2;
} else if (cb==0x47) {
newBitPos = ((Integer)getRawLong(data, bitPos).get(0)).intValue();
int longg = ((Integer)getRawLong(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
eedata.add(new Integer(longg));
size=size-4;
} else {
System.out.println("Unexpected code byte: " + cb);
}
}
Vector v = new Vector();
//v.add(handle, eedata);
extData.add(v);
}
Vector v = new Vector();
v.add(new Integer(bitPos));
v.add(extData);
return v;
}
/**
* Read a double value from a group of unsigned bytes and a default double
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @param defVal Default double value
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the double value
*/
public static Vector getDefaultDouble(int[] data, int offset, double defVal) throws Exception {
int flags = ((Integer)getBits(data, 2, offset)).intValue();
int read = 2;
double val;
if (flags==0x0) {
val = defVal;
} else {
int _offset = offset + 2;
String dstr;
if (flags==0x3) {
byte[] bytes = (byte[])getBits(data, 64, _offset);
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
val = bb.getDouble();
read = 66;
} else {
byte[] dstrArrayAux = new byte[8];
int[] doubleOffset = new int[]{0};
ByteUtils.doubleToBytes(defVal, dstrArrayAux, doubleOffset);
byte[] dstrArrayAuxx = new byte[8];
dstrArrayAuxx[0] = dstrArrayAux[7];
dstrArrayAuxx[1] = dstrArrayAux[6];
dstrArrayAuxx[2] = dstrArrayAux[5];
dstrArrayAuxx[3] = dstrArrayAux[4];
dstrArrayAuxx[4] = dstrArrayAux[3];
dstrArrayAuxx[5] = dstrArrayAux[2];
dstrArrayAuxx[6] = dstrArrayAux[1];
dstrArrayAuxx[7] = dstrArrayAux[0];
int[] dstrArrayAuxxx = new int[8];
for (int i=0;i<dstrArrayAuxxx.length;i++) {
dstrArrayAuxxx[i] = ByteUtils.getUnsigned(dstrArrayAuxx[i]);
}
byte[] dstrArray = new byte[8];
for (int i=0;i<dstrArray.length;i++) {
dstrArray[i] = (byte)dstrArrayAuxxx[i];
}
if (flags==0x1) {
byte[] ddArray = (byte[])getBits(data, 32, _offset);
dstrArray[0] = ddArray[0];
dstrArray[1] = ddArray[1];
dstrArray[2] = ddArray[2];
dstrArray[3] = ddArray[3];
read = 34;
} else {
byte[] ddArray = (byte[])getBits(data, 48, _offset);
dstrArray[4] = ddArray[0];
dstrArray[5] = ddArray[1];
dstrArray[0] = ddArray[2];
dstrArray[1] = ddArray[3];
dstrArray[2] = ddArray[4];
dstrArray[3] = ddArray[5];
read = 50;
}
ByteBuffer bb = ByteBuffer.wrap(dstrArray);
bb.order(ByteOrder.LITTLE_ENDIAN);
val = bb.getDouble();
}
}
Vector v = new Vector();
v.add(new Integer(offset+read));
v.add(new Double(val));
return v;
}
/**
* Read a double value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the double value
*/
public static Vector getBitDouble(int[] data, int offset) throws Exception {
Vector v = new Vector();
int type = ((Integer)getBits(data, 2, offset)).intValue();
int read = 2;
double val = 0.0;
if (type==0x00) {
byte[] bytes = (byte[])getBits(data, 64, (offset+2));
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
val = bb.getDouble();
read = 66;
} else if (type==0x01) {
val = 1.0;
} else if (type==0x02) {
val = 0.0;
} else {
System.out.println("Bad type at bit offset: " + offset);
}
v.add(new Integer(offset+read));
v.add(new Double(val));
return v;
}
/**
* Read a double value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the double value
*/
public static Vector getRawDouble(int[] data, int offset) throws Exception {
byte[] bytes = (byte[])getBits(data, 64, offset);
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
double val = bb.getDouble();
Vector v = new Vector();
v.add(new Integer(offset+64));
v.add(new Double(val));
return v;
}
/**
* Read a short value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the short value
*/
public static Vector getBitShort(int[] data, int offset) throws Exception {
Vector v = new Vector();
int type = ((Integer)getBits(data, 2, offset)).intValue();
int read = 2;
int val = 0;
if (type==0x00) {
byte[] bytes = (byte[])getBits(data, 16, (offset+2));
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
val = bb.getShort();
read = 18;
} else if (type==0x01) {
val = ((Integer)getBits(data, 8, (offset+2))).intValue();
read = 10;
} else if (type==0x02) {
val = 0;
} else if (type==0x03) {
val = 256;
}
v.add(new Integer(offset+read));
v.add(new Integer(val));
return v;
}
/**
* Read a short value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the short value
*/
public static Vector getRawShort(int[] data, int offset) throws Exception {
byte[] bytes = (byte[])getBits(data, 16, offset);
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
int val = bb.getShort();
Vector v = new Vector();
v.add(new Integer(offset+16));
v.add(new Integer(val));
return v;
}
/**
* Read a long value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the long value
*/
public static Vector getBitLong(int[] data, int offset) throws Exception {
int type = ((Integer)getBits(data, 2, offset)).intValue();
int read = 2;
int val = 0;
if (type==0x0) {
byte[] bytes = (byte[])getBits(data, 32, (offset+2));
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
val = bb.getInt();
read = 34;
} else if (type==0x01) {
val = ((Integer)getBits(data, 8, (offset+2))).intValue();
read = 10;
} else if (type==0x02) {
val = 0;
} else {
System.out.println("Bad type at bit offset: " + offset);
}
Vector v = new Vector();
v.add(new Integer(offset+read));
v.add(new Integer(val));
return v;
}
/**
* Read a long value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the long value
*/
public static Vector getRawLong(int[] data, int offset) {
Vector v = new Vector();
// TODO: Incorrecto. Repasar ...
// _val = struct.unpack('<l', _long)[0]
int val = 0;
v.add(new Integer(offset+32));
v.add(new Integer(val));
return v;
}
/**
* Read a char value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the char value
*/
public static Vector getRawChar(int[] data, int offset) throws Exception {
int charr = ((Integer)getBits(data, 8, offset)).intValue();
Vector v = new Vector();
v.add(new Integer(offset+8));
v.add(new Integer(charr));
return v;
}
/**
* Read a char value from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the char value
*/
public static Vector getModularChar(int[] data, int offset) throws Exception {
int val=0;
Vector bytes = new Vector();
boolean read = true;
int offsett = offset;
int fac = 1;
while (read) {
int bytee = ((Integer)getBits(data, 8, offsett)).intValue();
offsett = offsett + 8;
if ((bytee & 0x80)==0) {
read = false;
if ((bytee & 0x40)>0) {
fac = -1;
bytee = bytee & 0xbf;
}
}
bytes.add(new Integer(bytee & 0x7f));
}
if (bytes.size()==1) val = ((Integer)bytes.get(0)).intValue();
else if (bytes.size()==2) val = ((Integer)bytes.get(0)).intValue() | (((Integer)bytes.get(1)).intValue() << 7);
else if (bytes.size()==3) val = ((Integer)bytes.get(0)).intValue() | (((Integer)bytes.get(1)).intValue() << 7) | (((Integer)bytes.get(2)).intValue() << 14);
else if (bytes.size()==4) val = ((Integer)bytes.get(0)).intValue() | (((Integer)bytes.get(1)).intValue() << 7) | (((Integer)bytes.get(2)).intValue() << 14) | (((Integer)bytes.get(3)).intValue() << 21);
else System.out.println("Unexpected byte array length: " + bytes.size());
Vector v = new Vector();
v.add(new Integer(offsett));
v.add(new Integer(fac*val));
return v;
}
/**
* Read a String from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the String
*/
public static Vector getTextString(int[] data, int offset) throws Exception {
int bitPos = offset;
int newBitPos = ((Integer)DwgUtil.getBitShort(data, bitPos).get(0)).intValue();
int len = ((Integer)DwgUtil.getBitShort(data, bitPos).get(1)).intValue();
bitPos = newBitPos;
int bitLen = len * 8;
Object cosa = DwgUtil.getBits(data, bitLen, bitPos);
String string;
if (cosa instanceof byte[]) {
string = new String((byte[])cosa);
} else {
//string = ((Integer)cosa).toString();
byte[] bytes = new byte[]{((Integer)cosa).byteValue()};
string = new String((byte[])bytes);
}
bitPos = bitPos + bitLen;
Vector v = new Vector();
v.add(new Integer(bitPos));
v.add(string);
return v;
}
/**
* Read a int value (the handle of a DWG object) from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is the int value (handle of a DWG object)
*/
public static Vector getHandle(int[] data, int offset) throws Exception {
Vector v = new Vector();
int code = ((Integer)DwgUtil.getBits(data, 4, offset)).intValue();
int counter = ((Integer)DwgUtil.getBits(data, 4, (offset + 4))).intValue();
int read = 8;
Vector hlist = new Vector();
if (counter>0) {
int hlen = counter * 8;
Object handle = DwgUtil.getBits(data, hlen, (offset + 8));
read = read + hlen;
if (hlen > 8) {
byte[] handleBytes = (byte[])handle;
int[] handleInts = new int[handleBytes.length];
// Hacerlos unsigned ...
for (int i=0; i<handleBytes.length; i++) {
handleInts[i] = ByteUtils.getUnsigned(handleBytes[i]);
}
for (int i=0; i<handleInts.length; i++) {
hlist.add(new Integer(handleInts[i]));
}
} else {
hlist.add(handle);
}
}
v.add(new Integer(offset+read));
v.add(new Integer(code));
v.add(new Integer(counter));
for (int i=0;i<hlist.size();i++) {
v.add(hlist.get(i));
}
return v;
}
/**
* Read a int value (the size of a modular short) from a ByteBuffer
*
* @param bb Data given as a ByteBuffer
* @return int Size of the modular short
*/
public static int getModularShort(ByteBuffer bb) {
Vector shorts = new Vector();
bb.order(ByteOrder.BIG_ENDIAN);
short shortt = bb.getShort();
int size = 0;
while ((shortt & 0x80)>0) {
shorts.add(new Short(shortt));
shortt = bb.getShort();
}
shorts.add(new Short(shortt));
for (int i=0; i<shorts.size(); i++) {
shortt = ((Short)shorts.get(i)).shortValue();
shorts.set(i, new Integer(((shortt & 0xff00) >> 8) | ((shortt & 0xff) << 8)));
}
int slen = shorts.size();
if (slen==1) {
size = (((Integer)shorts.get(0)).intValue()) & 0x7fff;//(new Integer(((Integer)shorts.get(0)).shortValue() & 0x7fff)).byteValue();
} else if (slen==2) {
int tmp = ((Integer)shorts.get(0)).intValue();
shorts.set(0, shorts.get(1));
shorts.set(1, new Integer(tmp));
size = (((((Integer)shorts.get(0)).intValue()) & 0x7fff) << 15) | (((((Integer)shorts.get(1)).intValue()) & 0x7fff));//(new Integer(((Integer)shorts.get(0)).shortValue() & 0x7fff)).byteValue();
} else {
System.out.println("Unexpected array length: " + slen);
}
return size;
}
/**
* Returns a set of bits from a group of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param count Bit counter
* @param offset The current bit offset where the value begins
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs
* when we are looking for LwPolylines.
* @return This method returns an array of bytes or an int value
*/
public static Object getBits(int[] data, int count, int offset) throws Exception {
int idx = offset/8;
int bitidx = offset%8;
/**
* mask1: bit mask to apply to the current byte
* lshift: left shift amount of mask results
* mask2: bit mask to apply to the next byte
* rshift: right shift amount of the mask results
*/
int[][] maskTable = new int[][]{
{0xff, 0, 0x00, 0}, // bit offset == 0
{0x7f, 1, 0x80, 7}, // bit offset == 1
{0x3f, 2, 0xc0, 6}, // bit offset == 2
{0x1f, 3, 0xe0, 5}, // bit offset == 3
{0x0f, 4, 0xf0, 4}, // bit offset == 4
{0x07, 5, 0xf8, 3}, // bit offset == 5
{0x03, 6, 0xfc, 2}, // bit offset == 6
{0x01, 7, 0xfe, 1}, // bit offset == 7
};
int mask1 = maskTable[bitidx][0];
int lsh = maskTable[bitidx][1];
int mask2 = maskTable[bitidx][2];
int rsh = maskTable[bitidx][3];
int binc = 8 - bitidx;
int read = 0;
int rem = count;
int bytee = 0x0;
Vector bytes = new Vector();
while (read < count) {
int b1 = 0;
if (rem > binc) {
b1 = (data[idx] & mask1);
read = read + binc;
rem = rem - binc;
} else {
b1 = ((data[idx] & mask1) >> (8 - bitidx - rem));
bytee = b1;
read = read + rem;
rem = 0;
}
if (read < count) {
idx = idx + 1;
if (rem > bitidx) {
int b2 = (data[idx] & mask2);
bytee = (b1 << lsh) | (b2 >> rsh);
read = read + bitidx;
rem = rem - bitidx;
} else {
int mask = maskTable[rem][2];
int b2 = data[idx] & mask;
bytee = (b1 << rem) | (b2 >> (8 - rem));
read = read + rem;
rem = 0;
}
}
if (count > 8) {
bytes.add(new Integer(bytee));
}
}
if (bytes.size()>0) {
byte[] newBytes = new byte[bytes.size()];
for (int i=0; i<newBytes.length; i++) {
newBytes[i] = ((Integer)bytes.get(i)).byteValue();
}
return newBytes;
}
return new Integer(bytee);
}
/**
* Test a bit obtained from a set of unsigned bytes
*
* @param data Array of unsigned bytes obtained from the DWG binary file
* @param offset The current bit offset where the value begins
* @return Vector This vector has two parts. First is an int value that represents
* the new offset, and second is a bit flag
*/
public static Vector testBit(int[] data, int offset) {
int idx = offset/8;
int bitidx = offset%8;
int mask = 0x1 << (7-bitidx);
boolean val = false;
if ((data[idx] & mask) > 0) val = true;
Vector v = new Vector();
v.add(new Integer(offset+1));
v.add(new Boolean(val));
return v;
}
/**
* Convert bytes to machine value bytes
*
* @param data Input of array of bytes
* @return int[] Output of array of machine bytes
*/
public static int[] bytesToMachineBytes(byte[] data) {
String[] dataString = new String[data.length];
int[] dataOut = new int[data.length];
for (int i=0; i<data.length; i++) {
dataString[i] = HexUtil.bytesToHex(new byte[]{data[i]});
Integer dataInt = Integer.decode("0x" + dataString[i]);
dataOut[i] = dataInt.intValue();
}
return dataOut;
}
/**
* Obtain the int value of a handle given in binary format
*
* @param layerHandle Handle in binary format
* @return int Int value of the handle
*/
public static int handleBinToHandleInt(Vector layerHandle) {
byte[] layerBytes = new byte[]{0,0,0,0};
if (layerHandle.size()>2) layerBytes[3] = (byte)((Integer)layerHandle.get(2)).intValue();
if (layerHandle.size()>3) {
layerBytes[3] = (byte)((Integer)layerHandle.get(3)).intValue();
layerBytes[2] = (byte)((Integer)layerHandle.get(2)).intValue();
}
if (layerHandle.size()>4) {
layerBytes[3] = (byte)((Integer)layerHandle.get(4)).intValue();
layerBytes[2] = (byte)((Integer)layerHandle.get(3)).intValue();
layerBytes[1] = (byte)((Integer)layerHandle.get(2)).intValue();
}
if (layerHandle.size()>5) {
layerBytes[3] = (byte)((Integer)layerHandle.get(5)).intValue();
layerBytes[2] = (byte)((Integer)layerHandle.get(4)).intValue();
layerBytes[1] = (byte)((Integer)layerHandle.get(3)).intValue();
layerBytes[0] = (byte)((Integer)layerHandle.get(2)).intValue();
}
int layer = ByteUtils.bytesToInt(layerBytes, new int[]{0});
return layer;
}
}