You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2010/09/10 18:33:42 UTC

svn commit: r995859 [5/30] - in /commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan: ./ color/ common/ common/byteSources/ common/mylzw/ formats/bmp/ formats/bmp/pixelparsers/ formats/bmp/writers/ formats/gif/ formats/ico/ formats/jpeg/ fo...

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java?rev=995859&r1=995858&r2=995859&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java Fri Sep 10 16:33:35 2010
@@ -28,1081 +28,1081 @@ import org.apache.sanselan.ImageWriteExc
 
 public class BinaryFileFunctions implements BinaryConstants
 {
-	protected boolean debug = false;
+    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);
-
-			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();
-	}
+    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);
+
+            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();
+    }
 }
\ No newline at end of file

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileParser.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileParser.java?rev=995859&r1=995858&r2=995859&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileParser.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileParser.java Fri Sep 10 16:33:35 2010
@@ -23,102 +23,102 @@ import org.apache.sanselan.ImageReadExce
 
 public class BinaryFileParser extends BinaryFileFunctions
 {
-	public BinaryFileParser(int byteOrder)
-	{
-		this.byteOrder = byteOrder;
-	}
-
-	public BinaryFileParser()
-	{
-
-	}
-
-	// default byte order for Java, many file formats.
-	private int byteOrder = BYTE_ORDER_NETWORK;
-
-	// protected boolean BYTE_ORDER_reversed = true;
-
-	protected void setByteOrder(int a, int b) throws ImageReadException,
-			IOException
-	{
-		if (a != b)
-			throw new ImageReadException("Byte Order bytes don't match (" + a
-					+ ", " + b + ").");
-
-		if (a == BYTE_ORDER_MOTOROLA)
-			byteOrder = a;
-		else if (a == BYTE_ORDER_INTEL)
-			byteOrder = a;
-		else
-			throw new ImageReadException("Unknown Byte Order hint: " + a);
-	}
-
-	protected void setByteOrder(int byteOrder)
-	{
-		this.byteOrder = byteOrder;
-	}
-
-	protected int getByteOrder()
-	{
-		return byteOrder;
-	}
-
-	protected final int convertByteArrayToInt(String name, int start,
-			byte bytes[])
-	{
-		return convertByteArrayToInt(name, bytes, start, byteOrder);
-	}
-
-	protected final int convertByteArrayToInt(String name, byte bytes[])
-	{
-		return convertByteArrayToInt(name, bytes, byteOrder);
-	}
-
-	public final int convertByteArrayToShort(String name, byte bytes[])
-			throws ImageReadException
-	{
-		return convertByteArrayToShort(name, bytes, byteOrder);
-	}
-
-	public final int convertByteArrayToShort(String name, int start,
-			byte bytes[]) throws ImageReadException
-	{
-		return convertByteArrayToShort(name, start, bytes, byteOrder);
-	}
-
-	public final int read4Bytes(String name, InputStream is, String exception)
-			throws ImageReadException, IOException
-	{
-		return read4Bytes(name, is, exception, byteOrder);
-	}
-
-	public final int read3Bytes(String name, InputStream is, String exception)
-			throws ImageReadException, IOException
-	{
-		return read3Bytes(name, is, exception, byteOrder);
-	}
-
-	public final int read2Bytes(String name, InputStream is, String exception)
-			throws ImageReadException, IOException
-	{
-		return read2Bytes(name, is, exception, byteOrder);
-	}
-
-	public static boolean byteArrayHasPrefix(byte bytes[], byte prefix[])
-	{
-		if ((bytes == null) || (bytes.length < prefix.length))
-			return false;
-
-		for (int i = 0; i < prefix.length; i++)
-			if (bytes[i] != prefix[i])
-				return false;
-
-		return true;
-	}
-
-	protected final byte[] int2ToByteArray(int value)
-	{
-		return int2ToByteArray(value, byteOrder);
-	}
+    public BinaryFileParser(int byteOrder)
+    {
+        this.byteOrder = byteOrder;
+    }
+
+    public BinaryFileParser()
+    {
+
+    }
+
+    // default byte order for Java, many file formats.
+    private int byteOrder = BYTE_ORDER_NETWORK;
+
+    // protected boolean BYTE_ORDER_reversed = true;
+
+    protected void setByteOrder(int a, int b) throws ImageReadException,
+            IOException
+    {
+        if (a != b)
+            throw new ImageReadException("Byte Order bytes don't match (" + a
+                    + ", " + b + ").");
+
+        if (a == BYTE_ORDER_MOTOROLA)
+            byteOrder = a;
+        else if (a == BYTE_ORDER_INTEL)
+            byteOrder = a;
+        else
+            throw new ImageReadException("Unknown Byte Order hint: " + a);
+    }
+
+    protected void setByteOrder(int byteOrder)
+    {
+        this.byteOrder = byteOrder;
+    }
+
+    protected int getByteOrder()
+    {
+        return byteOrder;
+    }
+
+    protected final int convertByteArrayToInt(String name, int start,
+            byte bytes[])
+    {
+        return convertByteArrayToInt(name, bytes, start, byteOrder);
+    }
+
+    protected final int convertByteArrayToInt(String name, byte bytes[])
+    {
+        return convertByteArrayToInt(name, bytes, byteOrder);
+    }
+
+    public final int convertByteArrayToShort(String name, byte bytes[])
+            throws ImageReadException
+    {
+        return convertByteArrayToShort(name, bytes, byteOrder);
+    }
+
+    public final int convertByteArrayToShort(String name, int start,
+            byte bytes[]) throws ImageReadException
+    {
+        return convertByteArrayToShort(name, start, bytes, byteOrder);
+    }
+
+    public final int read4Bytes(String name, InputStream is, String exception)
+            throws ImageReadException, IOException
+    {
+        return read4Bytes(name, is, exception, byteOrder);
+    }
+
+    public final int read3Bytes(String name, InputStream is, String exception)
+            throws ImageReadException, IOException
+    {
+        return read3Bytes(name, is, exception, byteOrder);
+    }
+
+    public final int read2Bytes(String name, InputStream is, String exception)
+            throws ImageReadException, IOException
+    {
+        return read2Bytes(name, is, exception, byteOrder);
+    }
+
+    public static boolean byteArrayHasPrefix(byte bytes[], byte prefix[])
+    {
+        if ((bytes == null) || (bytes.length < prefix.length))
+            return false;
+
+        for (int i = 0; i < prefix.length; i++)
+            if (bytes[i] != prefix[i])
+                return false;
+
+        return true;
+    }
+
+    protected final byte[] int2ToByteArray(int value)
+    {
+        return int2ToByteArray(value, byteOrder);
+    }
 
 }
\ No newline at end of file