IntFromByteArray

From SkullSecurity
Jump to navigation Jump to search
/*

 * IntFromByteArray.java

 *

 * Created on May 21, 2004, 12:35 PM

 */



package util;



/** This is a class to take care of inserting or getting the value of an int in an array of

 * bytes.

 */

public class IntFromByteArray

{

    private boolean littleEndian;

    

    public static final IntFromByteArray LITTLEENDIAN = new IntFromByteArray(true);

    public static final IntFromByteArray BIGENDIAN = new IntFromByteArray(false);

    

    /**

     * @param args the command line arguments

     */

    

    /*public static void main(String args[])

    {

        byte[] test = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        

        IntFromByteArray ifba = new IntFromByteArray(true);

        

        int[] newArray = ifba.getIntArray(test);



        

        for(int i = 0; i < newArray.length; i++)

            System.out.print(PadString.padHex(newArray[i], 8) + " ");

    }*/



    public IntFromByteArray(boolean littleEndian)

    {

        this.littleEndian = littleEndian;

    }

    public int getInteger(byte[] array, int location)

    {

        if((location + 3) >= array.length)

            throw new ArrayIndexOutOfBoundsException("location = " + location + ", number of bytes = " + array.length + " (note: 4 available bytes are needed)");

        

        int retVal = 0;

        

        // reverse the byte to simulate little endian

        if(littleEndian)

        {

            retVal = retVal | ((array[location++] << 0)  & 0x000000FF);

            retVal = retVal | ((array[location++] << 8)  & 0x0000FF00);

            retVal = retVal | ((array[location++] << 16) & 0x00FF0000);

            retVal = retVal | ((array[location++] << 24) & 0xFF000000);

        }

        else

        {

            retVal = retVal | ((array[location++] << 24) & 0xFF000000);

            retVal = retVal | ((array[location++] << 16) & 0x00FF0000);

            retVal = retVal | ((array[location++] << 8)  & 0x0000FF00);

            retVal = retVal | ((array[location++] << 0)  & 0x000000FF);

        }

        

        return retVal;

    }

    

    

    /** This function is used to insert the byte into a specified spot in

     * an int array.  This is used to simulate pointers used in C++.

     * Note that this works in little endian only.

     * @param intBuffer The buffer to insert the int into.

     * @param b The byte we're inserting.

     * @param location The location (which byte) we're inserting it into.

     * @return The new array - this is returned for convenience only.

     */

    public byte[] insertInteger(byte[] array, int location, int b)

    {

        if(location + 3 >= array.length)

            throw new ArrayIndexOutOfBoundsException("location = " + location + ", length = " + array.length + " - note that we need 4 bytes to insert an int");

        

        if(littleEndian)

        {

            array[location++] = (byte)((b & 0x000000FF) >> 0);

            array[location++] = (byte)((b & 0x0000FF00) >> 8);

            array[location++] = (byte)((b & 0x00FF0000) >> 16);

            array[location++] = (byte)((b & 0xFF000000) >> 24);

        }

        else

        {

            array[location++] = (byte)((b & 0xFF000000) >> 24);

            array[location++] = (byte)((b & 0x00FF0000) >> 16);

            array[location++] = (byte)((b & 0x0000FF00) >> 8);

            array[location++] = (byte)((b & 0x000000FF) >> 0);

        }

        

        return array;

    }

    

    /** Note: This will cut off the end bytes to ensure it's a multiple of 4 */

    public int[] getIntArray(byte[] array)

    {

        int[] newArray = new int[array.length / 4];

        

        int pos = 0;

        for(int i = 0; i < newArray.length; i++)

        {

            if(littleEndian)

            {

                newArray[i] |= ((array[pos++] << 0) &  0x000000FF);

                newArray[i] |= ((array[pos++] << 8) &  0x0000FF00);

                newArray[i] |= ((array[pos++] << 16) & 0x00FF0000);

                newArray[i] |= ((array[pos++] << 24) & 0xFF000000);

            }

            else

            {

                newArray[i] |= array[pos++] << 24;

                newArray[i] |= array[pos++] << 16;

                newArray[i] |= array[pos++] << 8;

                newArray[i] |= array[pos++] << 0;

            }

        }

        

        return newArray;

    }

    

}