All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.sanselan.common.BinaryFileFunctions Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.sanselan.common;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;

import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.ImageWriteException;

public class BinaryFileFunctions implements BinaryConstants
{
    protected boolean debug = false;

    public final void setDebug(boolean b)
    {
        debug = b;
    }

    public final boolean getDebug()
    {
        return debug;
    }

    protected final void readRandomBytes(InputStream is)
            throws ImageReadException, IOException
    {

        for (int counter = 0; counter < 100; counter++)
        {
            readByte("" + counter, is, "Random Data");
        }
    }

    public final void debugNumber(String msg, int data)
    {
        debugNumber(msg, data, 1);
    }

    public final void debugNumber(String msg, int data, int bytes)
    {
        PrintWriter pw = new PrintWriter(System.out);
        debugNumber(pw, msg,
                data, bytes);
        pw.flush();
    }


    public final void debugNumber(PrintWriter pw, String msg, int data)
    {
        debugNumber(pw, msg, data, 1);
    }

    public final void debugNumber(PrintWriter pw, String msg, int data,
            int bytes)
    {
        pw.print(msg + ": " + data + " (");
        int byteData = data;
        for (int i = 0; i < bytes; i++)
        {
            if (i > 0)
                pw.print(",");
            int singleByte = 0xff & byteData;
            pw.print((char) singleByte + " [" + singleByte + "]");
            byteData >>= 8;
        }
        pw.println(") [0x" + Integer.toHexString(data) + ", "
                + Integer.toBinaryString(data) + "]");
        pw.flush();
    }

    public final boolean startsWith(byte haystack[], byte needle[])
    {
        if (needle == null)
            return false;
        if (haystack == null)
            return false;
        if (needle.length > haystack.length)
            return false;

        for (int i = 0; i < needle.length; i++)
        {
            if (needle[i] != haystack[i])
                return false;
        }

        return true;
    }

    public final byte[] readBytes(InputStream is, int count)
            throws ImageReadException, IOException
    {
        byte result[] = new byte[count];
        for (int i = 0; i < count; i++)
        {
            int data = is.read();
            result[i] = (byte) data;
        }
        return result;
    }

    public final void readAndVerifyBytes(InputStream is, byte expected[],
            String exception) throws ImageReadException, IOException
    {
        for (int i = 0; i < expected.length; i++)
        {
            int data = is.read();
            byte b = (byte) (0xff & data);

            if (data < 0)
                throw new ImageReadException("Unexpected EOF.");

            if (b != expected[i])
            {
                // System.out.println("i" + ": " + i);

                // this.debugByteArray("expected", expected);
                // debugNumber("data[" + i + "]", b);
                // debugNumber("expected[" + i + "]", expected[i]);

                throw new ImageReadException(exception);
            }
        }
    }

    protected final void readAndVerifyBytes(String name, InputStream is,
            byte expected[], String exception) throws ImageReadException,
            IOException
    {
        byte bytes[] = readByteArray(name, expected.length, is, exception);

        for (int i = 0; i < expected.length; i++)
        {
            if (bytes[i] != expected[i])
            {
                // System.out.println("i" + ": " + i);
                // debugNumber("bytes[" + i + "]", bytes[i]);
                // debugNumber("expected[" + i + "]", expected[i]);

                throw new ImageReadException(exception);
            }
        }
    }

    public final void skipBytes(InputStream is, int length, String exception)
            throws IOException
    {
        long total = 0;
        while (length != total)
        {
            long skipped = is.skip(length - total);
            if (skipped < 1)
                throw new IOException(exception + " (" + skipped + ")");
            total += skipped;
        }
    }

    protected final void scanForByte(InputStream is, byte value)
            throws IOException
    {
        int count = 0;
        for (int i = 0; count < 3; i++)
        // while(count<3)
        {
            int b = is.read();
            if (b < 0)
                return;
            if ((0xff & b) == value)
            {
                System.out.println("\t" + i + ": match.");
                count++;
            }
        }
    }

    public final byte readByte(String name, InputStream is, String exception)
            throws ImageReadException, IOException
    {
        int result = is.read();

        if ((result < 0))
        {
            System.out.println(name + ": " + result);
            throw new IOException(exception);
        }

        if (debug)
            debugNumber(name, result);

        return (byte) (0xff & result);
    }

    protected final RationalNumber[] convertByteArrayToRationalArray(
            String name, byte bytes[], int start, int length, int byteOrder)
    {
        int expectedLength = start + length * 8;

        if (bytes.length < expectedLength)
        {
            System.out.println(name + ": expected length: " + expectedLength
                    + ", actual length: " + bytes.length);
            return null;
        }

        RationalNumber result[] = new RationalNumber[length];

        for (int i = 0; i < length; i++)
        {
            result[i] = convertByteArrayToRational(name, bytes, start + i * 8,
                    byteOrder);
        }

        return result;
    }

    protected final RationalNumber convertByteArrayToRational(String name,
            byte bytes[], int byteOrder)
    {
        return convertByteArrayToRational(name, bytes, 0, byteOrder);
    }

    protected final RationalNumber convertByteArrayToRational(String name,
            byte bytes[], int start, int byteOrder)
    {
        int numerator = convertByteArrayToInt(name, bytes, start + 0, byteOrder);
        int divisor = convertByteArrayToInt(name, bytes, start + 4, byteOrder);

        return new RationalNumber(numerator, divisor);
    }

    protected final int convertByteArrayToInt(String name, byte bytes[],
            int byteOrder)
    {
        return convertByteArrayToInt(name, bytes, 0, byteOrder);
    }

    protected final int convertByteArrayToInt(String name, byte bytes[],
            int start, int byteOrder)
    {
        byte byte0 = bytes[start + 0];
        byte byte1 = bytes[start + 1];
        byte byte2 = bytes[start + 2];
        byte byte3 = bytes[start + 3];

        int result;

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            result = ((0xff & byte0) << 24) | ((0xff & byte1) << 16)
                    | ((0xff & byte2) << 8) | ((0xff & byte3) << 0);
        } else
        {
            // intel, little endian
            result = ((0xff & byte3) << 24) | ((0xff & byte2) << 16)
                    | ((0xff & byte1) << 8) | ((0xff & byte0) << 0);
        }

        if (debug)
            debugNumber(name, result, 4);

        return result;
    }

    protected final int[] convertByteArrayToIntArray(String name, byte bytes[],
            int start, int length, int byteOrder)
    {
        int expectedLength = start + length * 4;

        if (bytes.length < expectedLength)
        {
            System.out.println(name + ": expected length: " + expectedLength
                    + ", actual length: " + bytes.length);
            return null;
        }

        int result[] = new int[length];

        for (int i = 0; i < length; i++)
        {
            result[i] = convertByteArrayToInt(name, bytes, start + i * 4,
                    byteOrder);
        }

        return result;
    }

    protected final void writeIntInToByteArray(int value, byte bytes[],
            int start, int byteOrder)
    {
        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            bytes[start + 0] = (byte) (value >> 24);
            bytes[start + 1] = (byte) (value >> 16);
            bytes[start + 2] = (byte) (value >> 8);
            bytes[start + 3] = (byte) (value >> 0);
        } else
        {
            bytes[start + 3] = (byte) (value >> 24);
            bytes[start + 2] = (byte) (value >> 16);
            bytes[start + 1] = (byte) (value >> 8);
            bytes[start + 0] = (byte) (value >> 0);
        }
    }

    protected static final byte[] int2ToByteArray(int value, int byteOrder)
    {
        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            return new byte[] { (byte) (value >> 8), (byte) (value >> 0), };
        else
            return new byte[] { (byte) (value >> 0), (byte) (value >> 8), };
    }

    protected final byte[] convertIntArrayToByteArray(int values[],
            int byteOrder)
    {
        byte result[] = new byte[values.length * 4];

        for (int i = 0; i < values.length; i++)
        {
            writeIntInToByteArray(values[i], result, i * 4, byteOrder);
        }

        return result;
    }

    protected final byte[] convertShortArrayToByteArray(int values[],
            int byteOrder)
    {
        byte result[] = new byte[values.length * 2];

        for (int i = 0; i < values.length; i++)
        {
            int value = values[i];

            if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            {
                result[i * 2 + 0] = (byte) (value >> 8);
                result[i * 2 + 1] = (byte) (value >> 0);
            } else
            {
                result[i * 2 + 1] = (byte) (value >> 8);
                result[i * 2 + 0] = (byte) (value >> 0);
            }
        }

        return result;
    }

    protected final byte[] convertShortToByteArray(int value, int byteOrder)
    {
        byte result[] = new byte[2];

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            result[0] = (byte) (value >> 8);
            result[1] = (byte) (value >> 0);
        } else
        {
            result[1] = (byte) (value >> 8);
            result[0] = (byte) (value >> 0);
        }

        return result;
    }

    protected final byte[] convertIntArrayToRationalArray(int numerators[],
            int denominators[], int byteOrder) throws ImageWriteException
    {
        if (numerators.length != denominators.length)
            throw new ImageWriteException("numerators.length ("
                    + numerators.length + " != denominators.length ("
                    + denominators.length + ")");

        byte result[] = new byte[numerators.length * 8];

        for (int i = 0; i < numerators.length; i++)
        {
            writeIntInToByteArray(numerators[i], result, i * 8, byteOrder);
            writeIntInToByteArray(denominators[i], result, i * 8 + 4, byteOrder);
        }

        return result;
    }

    protected final byte[] convertRationalArrayToByteArray(
            RationalNumber numbers[], int byteOrder) throws ImageWriteException
    {
        // Debug.debug("convertRationalArrayToByteArray 2");
        byte result[] = new byte[numbers.length * 8];

        for (int i = 0; i < numbers.length; i++)
        {
            writeIntInToByteArray(numbers[i].numerator, result, i * 8,
                    byteOrder);
            writeIntInToByteArray(numbers[i].divisor, result, i * 8 + 4,
                    byteOrder);
        }

        return result;
    }

    protected final byte[] convertRationalToByteArray(RationalNumber number,
            int byteOrder) throws ImageWriteException
    {
        byte result[] = new byte[8];

        writeIntInToByteArray(number.numerator, result, 0, byteOrder);
        writeIntInToByteArray(number.divisor, result, 4, byteOrder);

        return result;
    }

    protected final int convertByteArrayToShort(String name, byte bytes[],
            int byteOrder) throws ImageReadException
    {
        return convertByteArrayToShort(name, 0, bytes, byteOrder);
    }

    protected final int convertByteArrayToShort(String name, int index,
            byte bytes[], int byteOrder) throws ImageReadException
    {
        if (index + 1 >= bytes.length)
            throw new ImageReadException("Index out of bounds. Array size: "
                    + bytes.length + ", index: " + index);

        int byte0 = 0xff & bytes[index + 0];
        int byte1 = 0xff & bytes[index + 1];

        int result;

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            result = (byte0 << 8) | byte1;
        else
            // intel, little endian
            result = (byte1 << 8) | byte0;

        if (debug)
            debugNumber(name, result, 2);

        return result;
    }

    protected final int[] convertByteArrayToShortArray(String name,
            byte bytes[], int start, int length, int byteOrder)
            throws ImageReadException

    {
        int expectedLength = start + length * 2;

        if (bytes.length < expectedLength)
        {
            System.out.println(name + ": expected length: " + expectedLength
                    + ", actual length: " + bytes.length);
            return null;
        }

        int result[] = new int[length];

        for (int i = 0; i < length; i++)
        {
            result[i] = convertByteArrayToShort(name, start + i * 2, bytes,
                    byteOrder);
        }

        return result;
    }

    public final byte[] readByteArray(String name, int length, InputStream is)
            throws IOException
    {
        String exception = name + " could not be read.";
        return readByteArray(name, length, is, exception);
    }

    public final byte[] readByteArray(String name, int length, InputStream is,
            String exception) throws IOException
    {
        byte result[] = new byte[length];

        int read = 0;
        while (read < length)
        {
            int count = is.read(result, read, length - read);
            // Debug.debug("count", count);
            if (count < 1)
                throw new IOException(exception+" count: "+ count + " read: "+read+" length: "+length);

            read += count;
        }

        if (debug)
        {
            for (int i = 0; ((i < length) && (i < 50)); i++)
            {
                debugNumber(name + " (" + i + ")", 0xff & result[i]);
            }
        }
        return result;
    }

    public final void debugByteArray(String name, byte bytes[])
    {
        System.out.println(name + ": " + bytes.length);

        for (int i = 0; ((i < bytes.length) && (i < 50)); i++)
        {
            debugNumber("\t" + " (" + i + ")", 0xff & bytes[i]);
        }
    }

    protected final void debugNumberArray(String name, int numbers[], int length)
    {
        System.out.println(name + ": " + numbers.length);

        for (int i = 0; ((i < numbers.length) && (i < 50)); i++)
        {
            debugNumber(name + " (" + i + ")", numbers[i], length);
        }
    }

    public final byte[] readBytearray(String name, byte bytes[], int start,
            int count) throws ImageReadException
    {
        if (bytes.length < (start + count))
        {
            throw new ImageReadException("Invalid read. bytes.length: " + bytes.length+ ", start: " + start + ", count: " + count);
            // return null;
        }

        byte result[] = new byte[count];
        System.arraycopy(bytes, start, result, 0, count);

        if (debug)
            debugByteArray(name, result);

        return result;
    }

    protected final byte[] getByteArrayTail(String name, byte bytes[], int count) throws ImageReadException
    {
        return readBytearray(name, bytes, count, bytes.length - count);
    }

    protected final byte[] getBytearrayHead(String name, byte bytes[], int count) throws ImageReadException
    {
        return readBytearray(name, bytes, 0, bytes.length - count);
    }

    public static final byte[] slice(byte bytes[], int start, int count)
    {
        if (bytes.length < (start + count))
            return null;

        byte result[] = new byte[count];
        System.arraycopy(bytes, start, result, 0, count);

        return result;
    }

    public static final byte[] tail(byte bytes[], int count)
    {
        if (count > bytes.length)
            count = bytes.length;
        return slice(bytes, bytes.length - count, count);
    }

    public static final byte[] head(byte bytes[], int count)
    {
        if (count > bytes.length)
            count = bytes.length;
        return slice(bytes, 0, count);
    }

    public final boolean compareByteArrays(byte a[], byte b[])
    {
        if (a.length != b.length)
            return false;

        return compareByteArrays(a, 0, b, 0, a.length);
    }

    public final boolean compareByteArrays(byte a[], int aStart, byte b[],
            int bStart, int length)
    {
        if (a.length < (aStart + length))
        {
            return false;
        }
        if (b.length < (bStart + length))
            return false;

        for (int i = 0; i < length; i++)
        {
            if (a[aStart + i] != b[bStart + i])
            {
                // debugNumber("\t" + "a[" + (aStart + i) + "]", a[aStart + i]);
                // debugNumber("\t" + "b[" + (bStart + i) + "]", b[bStart + i]);

                return false;
            }
        }

        return true;
    }

    public static final boolean compareBytes(byte a[], byte b[])
    {
        if (a.length != b.length)
            return false;

        return compareBytes(a, 0, b, 0, a.length);
    }

    public static final boolean compareBytes(byte a[], int aStart, byte b[],
            int bStart, int length)
    {
        if (a.length < (aStart + length))
            return false;
        if (b.length < (bStart + length))
            return false;

        for (int i = 0; i < length; i++)
        {
            if (a[aStart + i] != b[bStart + i])
                return false;
        }

        return true;
    }

    protected final int read4Bytes(String name, InputStream is,
            String exception, int byteOrder) throws ImageReadException,
            IOException
    {
        int size = 4;
        byte bytes[] = new byte[size];

        int read = 0;
        while (read < size)
        {
            int count = is.read(bytes, read, size - read);
            if (count < 1)
                throw new IOException(exception);

            read += count;
        }

        return convertByteArrayToInt(name, bytes, byteOrder);
    }

    protected final int read3Bytes(String name, InputStream is,
            String exception, int byteOrder) throws ImageReadException,
            IOException
    {
        byte byte0 = (byte) is.read();
        byte byte1 = (byte) is.read();
        byte byte2 = (byte) is.read();

        int result;

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            result = ((0xff & byte0) << 16) | ((0xff & byte1) << 8)
                    | ((0xff & byte2) << 0);
        else
            // intel, little endian
            result = ((0xff & byte2) << 16) | ((0xff & byte1) << 8)
                    | ((0xff & byte0) << 0);

        if (debug)
            debugNumber(name, result, 3);

        return result;
        //
        //
        // int size = 3;
        // byte bytes[] = new byte[size];
        //
        // int read = 0;
        // while (read < size)
        // {
        // int count = is.read(bytes, read, size - read);
        // if (count < 1)
        // throw new IOException(exception);
        //
        // read += count;
        // }
        //
        // return convertByteArrayToInt(name, bytes, 0, 3, byteOrder);
    }

    protected final int read2Bytes(String name, InputStream is,
            String exception, int byteOrder) throws ImageReadException,
            IOException
    {
        int size = 2;
        byte bytes[] = new byte[size];

        int read = 0;
        while (read < size)
        {
            int count = is.read(bytes, read, size - read);
            if (count < 1)
                throw new IOException(exception);

            read += count;
        }

        return convertByteArrayToShort(name, bytes, byteOrder);
    }

    protected final void printCharQuad(String msg, int i)
    {
        System.out.println(msg + ": '" + (char) (0xff & (i >> 24))
                + (char) (0xff & (i >> 16)) + (char) (0xff & (i >> 8))
                + (char) (0xff & (i >> 0)) + "'");

    }

    protected final void printCharQuad(PrintWriter pw, String msg, int i)
    {
        pw.println(msg + ": '" + (char) (0xff & (i >> 24))
                + (char) (0xff & (i >> 16)) + (char) (0xff & (i >> 8))
                + (char) (0xff & (i >> 0)) + "'");

    }

    protected final void printByteBits(String msg, byte i)
    {
        System.out.println(msg + ": '" + Integer.toBinaryString(0xff & i));
    }

    public final static int CharsToQuad(char c1, char c2, char c3, char c4)
    {
        return (((0xff & c1) << 24) | ((0xff & c2) << 16) | ((0xff & c3) << 8) | ((0xff & c4) << 0));
    }

    public final int findNull(byte src[])
    {
        return findNull(src, 0);
    }

    public final int findNull(byte src[], int start)
    {
        for (int i = start; i < src.length; i++)
        {
            if (src[i] == 0)
                return i;

        }
        return -1;
    }

    protected final byte[] getRAFBytes(RandomAccessFile raf, long pos,
            int length, String exception) throws IOException
    {
        if (debug)
        {
            System.out.println("getRAFBytes pos" + ": " + pos);
            System.out.println("getRAFBytes length" + ": " + length);
        }

        byte result[] = new byte[length];

        raf.seek(pos);

        int read = 0;
        while (read < length)
        {
            int count = raf.read(result, read, length - read);
            if (count < 1)
                throw new IOException(exception);

            read += count;
        }

        return result;

    }

    protected final float convertByteArrayToFloat(String name, byte bytes[],
            int byteOrder)
    {
        return convertByteArrayToFloat(name, bytes, 0, byteOrder);
    }

    protected final float convertByteArrayToFloat(String name, byte bytes[],
            int start, int byteOrder)
    {
        // TODO: not tested; probably wrong.

        byte byte0 = bytes[start + 0];
        byte byte1 = bytes[start + 1];
        byte byte2 = bytes[start + 2];
        byte byte3 = bytes[start + 3];

        int bits;

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            bits = ((0xff & byte0) << 24) | ((0xff & byte1) << 16)
                    | ((0xff & byte2) << 8) | ((0xff & byte3) << 0);
        } else
        {
            // intel, little endian
            bits = ((0xff & byte3) << 24) | ((0xff & byte2) << 16)
                    | ((0xff & byte1) << 8) | ((0xff & byte0) << 0);
        }

        float result = Float.intBitsToFloat(bits);

        // if (debug)
        // debugNumber(name, result, 4);

        return result;
    }

    protected final float[] convertByteArrayToFloatArray(String name,
            byte bytes[], int start, int length, int byteOrder)
    {
        int expectedLength = start + length * 4;

        if (bytes.length < expectedLength)
        {
            System.out.println(name + ": expected length: " + expectedLength
                    + ", actual length: " + bytes.length);
            return null;
        }

        float result[] = new float[length];

        for (int i = 0; i < length; i++)
        {
            result[i] = convertByteArrayToFloat(name, bytes, start + i * 4,
                    byteOrder);
        }

        return result;
    }

    protected final byte[] convertFloatToByteArray(float value, int byteOrder)
    {
        // TODO: not tested; probably wrong.
        byte result[] = new byte[4];

        int bits = Float.floatToRawIntBits(value);

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            result[0] = (byte) (0xff & (bits >> 0));
            result[1] = (byte) (0xff & (bits >> 8));
            result[2] = (byte) (0xff & (bits >> 16));
            result[3] = (byte) (0xff & (bits >> 24));
        } else
        {
            result[3] = (byte) (0xff & (bits >> 0));
            result[2] = (byte) (0xff & (bits >> 8));
            result[1] = (byte) (0xff & (bits >> 16));
            result[0] = (byte) (0xff & (bits >> 24));
        }

        return result;
    }

    protected final byte[] convertFloatArrayToByteArray(float values[],
            int byteOrder)
    {
        // TODO: not tested; probably wrong.
        byte result[] = new byte[values.length * 4];
        for (int i = 0; i < values.length; i++)
        {
            float value = values[i];
            int bits = Float.floatToRawIntBits(value);

            int start = i * 4;
            if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            {
                result[start + 0] = (byte) (0xff & (bits >> 0));
                result[start + 1] = (byte) (0xff & (bits >> 8));
                result[start + 2] = (byte) (0xff & (bits >> 16));
                result[start + 3] = (byte) (0xff & (bits >> 24));
            } else
            {
                result[start + 3] = (byte) (0xff & (bits >> 0));
                result[start + 2] = (byte) (0xff & (bits >> 8));
                result[start + 1] = (byte) (0xff & (bits >> 16));
                result[start + 0] = (byte) (0xff & (bits >> 24));
            }
        }
        return result;
    }

    protected final byte[] convertDoubleToByteArray(double value, int byteOrder)
    {
        // TODO: not tested; probably wrong.
        byte result[] = new byte[8];

        long bits = Double.doubleToRawLongBits(value);

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            result[0] = (byte) (0xff & (bits >> 0));
            result[1] = (byte) (0xff & (bits >> 8));
            result[2] = (byte) (0xff & (bits >> 16));
            result[3] = (byte) (0xff & (bits >> 24));
            result[4] = (byte) (0xff & (bits >> 32));
            result[5] = (byte) (0xff & (bits >> 40));
            result[6] = (byte) (0xff & (bits >> 48));
            result[7] = (byte) (0xff & (bits >> 56));
        } else
        {
            result[7] = (byte) (0xff & (bits >> 0));
            result[6] = (byte) (0xff & (bits >> 8));
            result[5] = (byte) (0xff & (bits >> 16));
            result[4] = (byte) (0xff & (bits >> 24));
            result[3] = (byte) (0xff & (bits >> 32));
            result[2] = (byte) (0xff & (bits >> 40));
            result[1] = (byte) (0xff & (bits >> 48));
            result[0] = (byte) (0xff & (bits >> 56));
        }

        return result;
    }

    protected final byte[] convertDoubleArrayToByteArray(double values[],
            int byteOrder)
    {
        // TODO: not tested; probably wrong.
        byte result[] = new byte[values.length * 8];
        for (int i = 0; i < values.length; i++)
        {
            double value = values[i];
            long bits = Double.doubleToRawLongBits(value);

            int start = i * 8;
            if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
            {
                result[start + 0] = (byte) (0xff & (bits >> 0));
                result[start + 1] = (byte) (0xff & (bits >> 8));
                result[start + 2] = (byte) (0xff & (bits >> 16));
                result[start + 3] = (byte) (0xff & (bits >> 24));
                result[start + 4] = (byte) (0xff & (bits >> 32));
                result[start + 5] = (byte) (0xff & (bits >> 40));
                result[start + 6] = (byte) (0xff & (bits >> 48));
                result[start + 7] = (byte) (0xff & (bits >> 56));
            } else
            {
                result[start + 7] = (byte) (0xff & (bits >> 0));
                result[start + 6] = (byte) (0xff & (bits >> 8));
                result[start + 5] = (byte) (0xff & (bits >> 16));
                result[start + 4] = (byte) (0xff & (bits >> 24));
                result[start + 3] = (byte) (0xff & (bits >> 32));
                result[start + 2] = (byte) (0xff & (bits >> 40));
                result[start + 1] = (byte) (0xff & (bits >> 48));
                result[start + 0] = (byte) (0xff & (bits >> 56));
            }
        }
        return result;
    }

    protected final double convertByteArrayToDouble(String name, byte bytes[],
            int byteOrder)
    {
        return convertByteArrayToDouble(name, bytes, 0, byteOrder);
    }

    protected final double convertByteArrayToDouble(String name, byte bytes[],
            int start, int byteOrder)
    {
        // TODO: not tested; probably wrong.

        byte byte0 = bytes[start + 0];
        byte byte1 = bytes[start + 1];
        byte byte2 = bytes[start + 2];
        byte byte3 = bytes[start + 3];
        byte byte4 = bytes[start + 4];
        byte byte5 = bytes[start + 5];
        byte byte6 = bytes[start + 6];
        byte byte7 = bytes[start + 7];

        long bits;

        if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        {
            bits = ((0xff & byte0) << 56) | ((0xff & byte1) << 48)
                    | ((0xff & byte2) << 40) | ((0xff & byte3) << 32)
                    | ((0xff & byte4) << 24) | ((0xff & byte5) << 16)
                    | ((0xff & byte6) << 8) | ((0xff & byte7) << 0);

        } else
        {
            // intel, little endian
            bits = ((0xff & byte7) << 56) | ((0xff & byte6) << 48)
                    | ((0xff & byte5) << 40) | ((0xff & byte4) << 32)
                    | ((0xff & byte3) << 24) | ((0xff & byte2) << 16)
                    | ((0xff & byte1) << 8) | ((0xff & byte0) << 0);
        }

        double result = Double.longBitsToDouble(bits);

        // if (debug)
        // debugNumber(name, result, 4);

        return result;

        // byte array[];
        // if (byteOrder == BYTE_ORDER_MOTOROLA) // motorola, big endian
        // // ?? dunno byte order very likely wrong here.
        // array = new byte[]{
        // bytes[start + 0], bytes[start + 1], bytes[start + 2],
        // bytes[start + 3], bytes[start + 4], bytes[start + 5],
        // bytes[start + 6], bytes[start + 7],
        //
        // };
        // else
        // // ?? dunno byte order very likely wrong here.
        // array = new byte[]{
        // bytes[start + 3], bytes[start + 2], bytes[start + 1],
        // bytes[start + 0], bytes[start + 7], bytes[start + 6],
        // bytes[start + 5], bytes[start + 4],
        // };
        //
        // double result = Double.NaN;
        //
        // try
        // {
        // ByteArrayInputStream bais = new ByteArrayInputStream(array);
        // if (start > 0)
        // {
        // skipBytes(bais, start);
        // // bais.skip(start);
        // }
        // DataInputStream dis = new DataInputStream(bais);
        // result = dis.readDouble();
        //
        // dis.close();
        // }
        // catch (Exception e)
        // {
        // Debug.debug(e);
        // }
        //
        // return result;
    }

    protected final double[] convertByteArrayToDoubleArray(String name,
            byte bytes[], int start, int length, int byteOrder)
    {
        int expectedLength = start + length * 8;

        if (bytes.length < expectedLength)
        {
            System.out.println(name + ": expected length: " + expectedLength
                    + ", actual length: " + bytes.length);
            return null;
        }

        double result[] = new double[length];

        for (int i = 0; i < length; i++)
        {
            result[i] = convertByteArrayToDouble(name, bytes, start + i * 8,
                    byteOrder);
        }

        return result;
    }

    protected void skipBytes(InputStream is, int length) throws IOException
    {
        this.skipBytes(is, length, "Couldn't skip bytes");
    }

    public final void copyStreamToStream(InputStream is, OutputStream os)
            throws IOException
    {
        byte buffer[] = new byte[1024];
        int read;
        while ((read = is.read(buffer)) > 0)
        {
            os.write(buffer, 0, read);
        }
    }

    public final byte[] getStreamBytes(InputStream is) throws IOException
    {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        copyStreamToStream(is, os);
        return os.toByteArray();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy