FileDocCategorySizeDatePackage
LittleEndian.javaAPI DocApache Poi 3.0.117579Mon Jan 01 12:39:42 GMT 2007org.apache.poi.util

LittleEndian

public class LittleEndian extends Object implements LittleEndianConsts
a utility class for handling little-endian numbers, which the 80x86 world is replete with. The methods are all static, and input/output is from/to byte arrays, or from InputStreams.
author
Marc Johnson (mjohnson at apache dot org)
author
Andrew Oliver (acoliver at apache dot org)

Fields Summary
Constructors Summary
private LittleEndian()
Constructor for the LittleEndian object

 
Methods Summary
public static byte[]getByteArray(byte[] data, int offset, int size)
Copy a portion of a byte array

param
data the original byte array
param
offset Where to start copying from.
param
size Number of bytes to copy.
return
The byteArray value
throws
IndexOutOfBoundsException - if copying would cause access of data outside array bounds.

        byte[] copy = new byte[size];
        System.arraycopy(data, offset, copy, 0, size);

        return copy;
    
public static doublegetDouble(byte[] data, int offset)
get a double value from a byte array, reads it in little endian format then converts the resulting revolting IEEE 754 (curse them) floating point number to a happy java double

param
data the byte array
param
offset a starting offset into the byte array
return
the double (64-bit) value

        return Double.longBitsToDouble(getNumber(data, offset, DOUBLE_SIZE));
    
public static doublegetDouble(byte[] data)
get a double value from the beginning of a byte array

param
data the byte array
return
the double (64-bit) value

        return getDouble(data, 0);
    
public static intgetInt(byte[] data, int offset)
get an int value from a byte array

param
data the byte array
param
offset a starting offset into the byte array
return
the int (32-bit) value

        return (int) getNumber(data, offset, INT_SIZE);
    
public static intgetInt(byte[] data)
get an int value from the beginning of a byte array

param
data the byte array
return
the int (32-bit) value

        return getInt(data, 0);
    
public static longgetLong(byte[] data, int offset)
get a long value from a byte array

param
data the byte array
param
offset a starting offset into the byte array
return
the long (64-bit) value

        return getNumber(data, offset, LONG_SIZE);
    
public static longgetLong(byte[] data)
get a long value from the beginning of a byte array

param
data the byte array
return
the long (64-bit) value

        return getLong(data, 0);
    
private static longgetNumber(byte[] data, int offset, int size)
Gets the number attribute of the LittleEndian class

param
data Description of the Parameter
param
offset Description of the Parameter
param
size Description of the Parameter
return
The number value

        long result = 0;

        for (int j = offset + size - 1; j >= offset; j--) {
            result <<= 8;
            result |= 0xff & data[j];
        }
        return result;
    
public static shortgetShort(byte[] data, int offset)
get a short value from a byte array

param
data the byte array
param
offset a starting offset into the byte array
return
the short (16-bit) value

        return (short) getNumber(data, offset, SHORT_SIZE);
    
public static shortgetShort(byte[] data)
get a short value from the beginning of a byte array

param
data the byte array
return
the short (16-bit) value

        return getShort(data, 0);
    
public static short[]getShortArray(byte[] data, int offset)
get a short array from a byte array. The short array is assumed to start with a word describing the length of the array.

param
data Description of the Parameter
param
offset Description of the Parameter
return
The shortArray value

        int size = (int) getNumber(data, offset, SHORT_SIZE);
        short[] results = getSimpleShortArray(data, offset, size);
        return results;
    
public static short[]getSimpleShortArray(byte[] data, int offset, int size)
get a short array from a byte array.

param
data Description of the Parameter
param
offset Description of the Parameter
param
size Description of the Parameter
return
The simpleShortArray value

        short[] results = new short[size];
        for (int i = 0; i < size; i++) {
            results[i] = getShort(data, offset + 2 + (i * 2));
        }
        return results;
    
public static longgetUInt(byte[] data, int offset)
get an unsigned int value from a byte array

param
data the byte array
param
offset a starting offset into the byte array
return
the unsigned int (32-bit) value in a long

        int num = (int) getNumber(data, offset, INT_SIZE);
        long retNum;
        if (num < 0) {
            retNum = ((long) Integer.MAX_VALUE + 1) * 2 + num;
        } else {
            retNum = num;
        }
        return retNum;
    
public static longgetUInt(byte[] data)
get an unsigned int value from a byte array

param
data the byte array
return
the unsigned int (32-bit) value in a long

	return getUInt(data,0);
    
public static longgetULong(byte[] data, int offset)

Gets an unsigned int value (8 bytes) from a byte array.

param
data the byte array
param
offset a starting offset into the byte array
return
the unsigned int (32-bit) value in a long

        int num = (int) getNumber(data, offset, LONG_SIZE);
        long retNum;
        if (num < 0)
            retNum = ((long) Integer.MAX_VALUE + 1) * 2 + num;
        else
            retNum = num;
        return retNum;
    
public static intgetUShort(byte[] data, int offset)
get an unsigned short value from a byte array

param
data the byte array
param
offset a starting offset into the byte array
return
the unsigned short (16-bit) value in an integer

        short num = (short) getNumber(data, offset, SHORT_SIZE);
        int retNum;
        if (num < 0) {
            retNum = (Short.MAX_VALUE + 1) * 2 + num;
        } else {
            retNum = num;
        }
        return retNum;
    
public static intgetUShort(byte[] data)
get an unsigned short value from the beginning of a byte array

param
data the byte array
return
the unsigned short (16-bit) value in an int

        return getUShort(data, 0);
    
public static intgetUnsignedByte(byte[] data, int offset)
get the unsigned value of a byte.

param
data the byte array.
param
offset a starting offset into the byte array.
return
the unsigned value of the byte as a 32 bit integer

        return (int) getNumber(data, offset, BYTE_SIZE);
    
public static intgetUnsignedByte(byte[] data)
get the unsigned value of a byte.

param
data the byte array
return
the unsigned value of the byte as a 32 bit integer

        return getUnsignedByte(data, 0);
    
public static voidputDouble(byte[] data, int offset, double value)
put a double value into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the double (64-bit) value

        // Excel likes NaN to be a specific value.
        if (Double.isNaN(value))
            putNumber(data, offset, -276939487313920L, DOUBLE_SIZE);
        else
            putNumber(data, offset, Double.doubleToLongBits(value), DOUBLE_SIZE);
    
public static voidputDouble(byte[] data, double value)
put a double value into beginning of a byte array

param
data the byte array
param
value the double (64-bit) value

        putDouble(data, 0, value);
    
public static voidputInt(byte[] data, int offset, int value)
put an int value into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the int (32-bit) value

        putNumber(data, offset, value, INT_SIZE);
    
public static voidputInt(byte[] data, int value)
put an int value into beginning of a byte array

param
data the byte array
param
value the int (32-bit) value

        putInt(data, 0, value);
    
public static voidputLong(byte[] data, int offset, long value)
put a long value into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the long (64-bit) value

        putNumber(data, offset, value, LONG_SIZE);
    
public static voidputLong(byte[] data, long value)
put a long value into beginning of a byte array

param
data the byte array
param
value the long (64-bit) value

        putLong(data, 0, value);
    
private static voidputNumber(byte[] data, int offset, long value, int size)
Description of the Method

param
data Description of the Parameter
param
offset Description of the Parameter
param
value Description of the Parameter
param
size Description of the Parameter

        int limit = size + offset;
        long v = value;

        for (int j = offset; j < limit; j++) {
            data[j] = (byte) (v & 0xFF);
            v >>= 8;
        }
    
public static voidputShort(byte[] data, int offset, short value)
put a short value into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the short (16-bit) value

        putNumber(data, offset, value, SHORT_SIZE);
    
public static voidputShort(byte[] data, short value)
put a short value into beginning of a byte array

param
data the byte array
param
value the short (16-bit) value

        putShort(data, 0, value);
    
public static voidputShortArray(byte[] data, int offset, short[] value)
put a array of shorts into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the short array

        putNumber(data, offset, value.length, SHORT_SIZE);
        for (int i = 0; i < value.length; i++) {
            putNumber(data, offset + 2 + (i * 2), value[i], SHORT_SIZE);
        }
    
public static voidputUShort(byte[] data, int offset, int value)
put an unsigned short value into a byte array

param
data the byte array
param
offset a starting offset into the byte array
param
value the short (16-bit) value
exception
ArrayIndexOutOfBoundsException may be thrown

        putNumber(data, offset, value, SHORT_SIZE);
    
public static byte[]readFromStream(java.io.InputStream stream, int size)
Read the appropriate number of bytes from the stream and return them to the caller.

However, for the purposes of the POI project, this risk is deemed negligible. It is, however, so noted.

param
stream the InputStream we're reading from
param
size the number of bytes to read; in 99.99% of cases, this will be SHORT_SIZE, INT_SIZE, or LONG_SIZE -- but it doesn't have to be.
return
the byte array containing the required number of bytes. The array will contain all zero's on end of stream
exception
IOException will be propagated back to the caller
exception
BufferUnderrunException if the stream cannot provide enough bytes

        byte[] buffer = new byte[size];

        int count = stream.read(buffer);

        if (count == -1) {

            // return a zero-filled buffer
            Arrays.fill(buffer, (byte) 0);
        } else if (count != size) {
            throw new BufferUnderrunException();
        }
        return buffer;
    
public static intreadInt(java.io.InputStream stream)
get an int value from an InputStream

param
stream the InputStream from which the int is to be read
return
the int (32-bit) value
exception
IOException will be propagated back to the caller
exception
BufferUnderrunException if the stream cannot provide enough bytes

        return getInt(readFromStream(stream, INT_SIZE));
    
public static longreadLong(java.io.InputStream stream)
get a long value from an InputStream

param
stream the InputStream from which the long is to be read
return
the long (64-bit) value
exception
IOException will be propagated back to the caller
exception
BufferUnderrunException if the stream cannot provide enough bytes

        return getLong(readFromStream(stream, LONG_SIZE));
    
public static shortreadShort(java.io.InputStream stream)
get a short value from an InputStream

param
stream the InputStream from which the short is to be read
return
the short (16-bit) value
exception
IOException will be propagated back to the caller
exception
BufferUnderrunException if the stream cannot provide enough bytes

        return getShort(readFromStream(stream, SHORT_SIZE));
    
public static intubyteToInt(byte b)
Convert an 'unsigned' byte to an integer. ie, don't carry across the sign.

param
b Description of the Parameter
return
Description of the Return Value

        return ((b & 0x80) == 0 ? (int) b : (b & (byte) 0x7f) + 0x80);