blob: 4d25e38f71e2617a113069255d2270fe0d9fbb67 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.views.memory.renderings;
import java.math.BigInteger;
/**
* Util functions for data conversions
*/
public class RenderingsUtil {
public static final int LITTLE_ENDIAN = 0;
public static final int BIG_ENDIAN = 1;
public static final int ENDIANESS_UNKNOWN = 2;
/**
* Pad byte array with zero's with the byte array's length
* is shorter that what's expected the conversion functions.
* @param array
* @param size
* @param endianess
* @return an array of bytes
*/
protected static byte[] fillArray(byte[] array, int size, int endianess)
{
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
byte[] temp = new byte[size];
for (int i=0; i<array.length; i++)
{
temp[i] = array[i];
}
// fill up the rest of the array
for (int i=array.length; i<size; i++)
{
temp[i] = 0;
}
array = temp;
return array;
}
byte[] temp = new byte[size];
for (int i=0; i<size - array.length; i++)
{
temp[i] = 0;
}
int j=0;
// fill up the rest of the array
for (int i=size - array.length; i<size; i++)
{
temp[i] = array[j];
j++;
}
array = temp;
return array;
}
static public BigInteger convertByteArrayToUnsignedLong(byte[] array, int endianess)
{
if (array.length < 8)
{
array = fillArray(array, 8, endianess);
}
BigInteger value = new BigInteger("0"); //$NON-NLS-1$
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int i=0; i< 8; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft(i*8);
value = value.or(b);
}
}
else
{
for (int i=0; i< 8; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft((7-i)*8);
value = value.or(b);
}
}
return value;
}
/**
* Convert byte array to long.
* @param array
* @param endianess
* @return result of the conversion in long
*/
static public long convertByteArrayToLong(byte[] array, int endianess)
{
if (array.length < 8)
{
array = fillArray(array, 8, endianess);
}
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
long value = 0;
for (int i = 0; i < 8; i++) {
long b = array[i];
b &= 0xff;
value |= (b << (i * 8));
}
return value;
}
long value = 0;
for (int i=0; i< 8; i++)
{
long b = array[i];
b &= 0xff;
value |= (b<<((7-i)*8));
}
return value;
}
static public BigInteger convertByteArrayToSignedBigInt(byte[] array, int endianess)
{
if (array.length < 16)
{
array = fillArray(array, 16, endianess);
}
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
// reverse bytes
byte[] holder = new byte[16];
int j=15;
for (int i=0; i<16; i++, j--)
{
holder[i] = array[j];
}
// create BigInteger
BigInteger value = new BigInteger(holder);
return value;
}
BigInteger value = new BigInteger(array);
return value;
}
static public BigInteger convertByteArrayToSignedBigInt(byte[] array, int endianess, int arraySize)
{
if (array.length < arraySize)
{
array = fillArray(array, arraySize, endianess);
}
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
// reverse bytes
byte[] holder = new byte[arraySize];
int j=arraySize-1;
for (int i=0; i<arraySize; i++, j--)
{
holder[i] = array[j];
}
// create BigInteger
BigInteger value = new BigInteger(holder);
return value;
}
BigInteger value = new BigInteger(array);
return value;
}
static public BigInteger convertByteArrayToUnsignedBigInt(byte[] array, int endianess)
{
if (array.length < 16)
{
array = fillArray(array, 16, endianess);
}
BigInteger value = new BigInteger("0"); //$NON-NLS-1$
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int i=0; i< 16; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft(i*8);
value = value.or(b);
}
}
else
{
for (int i=0; i< 16; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft((15-i)*8);
value = value.or(b);
}
}
return value;
}
static public BigInteger convertByteArrayToUnsignedBigInt(byte[] array, int endianess, int arraySize)
{
if (array.length < arraySize)
{
array = fillArray(array, arraySize, endianess);
}
BigInteger value = new BigInteger("0"); //$NON-NLS-1$
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int i=0; i< arraySize; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft(i*8);
value = value.or(b);
}
}
else
{
for (int i=0; i< arraySize; i++)
{
byte[] temp = new byte[1];
temp[0] = array[i];
BigInteger b = new BigInteger(temp);
b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
b = b.shiftLeft((arraySize-1-i)*8);
value = value.or(b);
}
}
return value;
}
/**
* Convert byte array to integer.
* @param array
* @param endianess
* @return result of the conversion in int
*/
static public int convertByteArrayToInt(byte[] array, int endianess)
{
if (array.length < 4)
{
array = fillArray(array, 4, endianess);
}
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
int value = 0;
for (int i = 0; i < 4; i++) {
int b = array[i];
b &= 0xff;
value |= (b << (i * 8));
}
return value;
}
int value = 0;
for (int i=0; i< 4; i++)
{
int b = array[i];
b &= 0xff;
value |= (b<<((3-i)*8));
}
return value;
}
/**
* Convert byte array to short.
* @param array
* @param endianess
* @return result of teh conversion in short
*/
static public short convertByteArrayToShort(byte[] array, int endianess)
{
if (array.length < 2)
{
array = fillArray(array, 2, endianess);
}
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
short value = 0;
for (int i = 0; i < 2; i++) {
short b = array[i];
b &= 0xff;
value |= (b << (i * 8));
}
return value;
}
short value = 0;
for (int i=0; i< 2; i++)
{
short b = array[i];
b &= 0xff;
value |= (b<<((1-i)*8));
}
return value;
}
/**
* Convert big integer to byte array.
* @param i
* @param endianess
* @return result of the conversion in raw byte array
*/
static public byte[] convertBigIntegerToByteArray(BigInteger i, int endianess)
{
byte buf[]=new byte[16];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<16; j++)
{
BigInteger x = i.shiftRight(j*8);
buf[j] = x.byteValue();
}
return buf;
}
for (int j=15; j>=0; j--)
{
BigInteger x = i.shiftRight((15-j)*8);
buf[j] = x.byteValue();
}
return buf;
}
static public byte[] convertSignedBigIntToByteArray(BigInteger i, int endianess, int arraySize)
{
byte buf[]=new byte[arraySize];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<arraySize; j++)
{
BigInteger x = i.shiftRight(j*8);
buf[j] = x.byteValue();
}
return buf;
}
for (int j=arraySize-1; j>=0; j--)
{
BigInteger x = i.shiftRight((arraySize-1-j)*8);
buf[j] = x.byteValue();
}
return buf;
}
/**
* Convert big integer to byte array.
* @param i
* @param endianess
* @return result of the conversion in raw byte array
*/
static public byte[] convertUnsignedBigIntegerToByteArray(BigInteger i, int endianess)
{
byte buf[]=new byte[32];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<32; j++)
{
BigInteger x = i.shiftRight(j*8);
buf[j] = x.byteValue();
}
return buf;
}
for (int j=31; j>=0; j--)
{
BigInteger x = i.shiftRight((31-j)*8);
buf[j] = x.byteValue();
}
return buf;
}
static public byte[] convertUnsignedBigIntToByteArray(BigInteger i, int endianess, int arraySize)
{
byte buf[]=new byte[arraySize*2];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<arraySize*2; j++)
{
BigInteger x = i.shiftRight(j*8);
buf[j] = x.byteValue();
}
return buf;
}
for (int j=(arraySize*2)-1; j>=0; j--)
{
BigInteger x = i.shiftRight(((arraySize*2)-1-j)*8);
buf[j] = x.byteValue();
}
return buf;
}
/**
* Convert long to byte array.
* @param i
* @param endianess
* @return result of the conversion in raw byte array
*/
static public byte[] convertLongToByteArray(long i, int endianess)
{
byte buf[]=new byte[8];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<8; j++)
{
buf[j] = new Long(i>>j*8).byteValue();
}
return buf;
}
for (int j=7; j>=0; j--)
{
buf[j] = new Long(i>>(7-j)*8).byteValue();
}
return buf;
}
/**
* Convert integer to byte array.
* @param i
* @param endianess
* @return result of the conversion in raw byte array
*/
static public byte[] convertIntToByteArray(int i, int endianess)
{
byte buf[]=new byte[4];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (int j=0; j<4; j++)
{
buf[j] = new Integer(i>>j*8).byteValue();
}
return buf;
}
for (int j=3; j>=0; j--)
{
buf[j] = new Integer(i>>(3-j)*8).byteValue();
}
return buf;
}
/**
* Convert short to byte array.
* @param i
* @param endianess
* @return result of the conversion in raw byte array
*/
static public byte[] convertShortToByteArray(short i, int endianess)
{
byte buf[]=new byte[2];
if (endianess == RenderingsUtil.LITTLE_ENDIAN)
{
for (short j=0; j<2; j++)
{
buf[j] = new Integer(i>>j*8).byteValue();
}
return buf;
}
for (short j=1; j>=0; j--)
{
buf[j] = new Integer(i>>(1-j)*8).byteValue();
}
return buf;
}
/**
* byte array to Hex string helper
* replaces the Integer.toHexString() which can't convert byte values properly
* (always pads with FFFFFF)
*/
static public String convertByteArrayToHexString(byte[] byteArray)
{
StringBuffer strBuffer = new StringBuffer();
char charArray[];
for (int i=0; i<byteArray.length;i ++)
{
charArray = RenderingsUtil.convertByteToCharArray(byteArray[i]);
strBuffer.append(charArray);
}
return strBuffer.toString();
}
static public char[] convertByteToCharArray(byte aByte)
{
char charArray[] = new char[2];
int val = aByte;
if (val<0) val += 256;
charArray[0] = Character.forDigit(val/16, 16);
charArray[1] = Character.forDigit(val%16, 16);
return charArray;
}
/**
* Convert raw memory data to byte array
* @param str
* @param numBytes
* @param numCharsPerByte - number of characters per byte of data
* @return an array of byte, converted from a hex string
* @throws NumberFormatException
*/
public static byte[] convertHexStringToByteArray(String str, int numBytes, int numCharsPerByte) throws NumberFormatException
{
if (str.length() == 0)
return null;
StringBuffer buf = new StringBuffer(str);
// pad string with zeros
int requiredPadding = numBytes * numCharsPerByte - str.length();
while (requiredPadding > 0) {
buf.insert(0, "0"); //$NON-NLS-1$
requiredPadding--;
}
byte[] bytes = new byte[numBytes];
str = buf.toString();
// set data in memory
for (int i=0; i<bytes.length; i++)
{
// convert string to byte
String oneByte = str.substring(i*2, i*2+2);
Integer number = Integer.valueOf(oneByte, 16);
if (number.compareTo(Integer.valueOf(Byte.toString(Byte.MAX_VALUE))) > 0)
{
int temp = number.intValue();
temp = temp - 256;
String tempStr = Integer.toString(temp);
Byte myByte = Byte.valueOf(tempStr);
bytes[i] = myByte.byteValue();
}
else
{
Byte myByte = Byte.valueOf(oneByte, 16);
bytes[i] = myByte.byteValue();
}
}
return bytes;
}
}