/*
* LittleEndianInputStream.java
*
* Created on 07 November 2006, 08:26
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.inet.gradle.setup.image.image4j.io;
import java.io.EOFException;
import java.io.IOException;
/**
* Reads little-endian data from a source <tt>InputStream</tt> by reversing byte ordering.
* @author Ian McDonagh
*/
public class LittleEndianInputStream extends java.io.DataInputStream {
/**
* Creates a new instance of <tt>LittleEndianInputStream</tt>, which will read from the specified source.
* @param in the source <tt>InputStream</tt>
*/
public LittleEndianInputStream(java.io.InputStream in) {
super(in);
}
/**
* Reads a little-endian <tt>short</tt> value
* @throws java.io.IOException if an error occurs
* @return <tt>short</tt> value with reversed byte order
*/
public short readShortLE() throws IOException {
int b1 = read();
int b2 = read();
if (b1 < 0 || b2 < 0) {
throw new EOFException();
}
short ret = (short) ((b2 << 8) + (b1 << 0));
return ret;
}
/**
* Reads a little-endian <tt>int</tt> value.
* @throws java.io.IOException if an error occurs
* @return <tt>int</tt> value with reversed byte order
*/
public int readIntLE() throws IOException {
int b1 = read();
int b2 = read();
int b3 = read();
int b4 = read();
if (b1 < -1 || b2 < -1 || b3 < -1 || b4 < -1) {
throw new EOFException();
}
int ret = (b4 << 24) + (b3 << 16) + (b2 << 8) + (b1 << 0);
return ret;
}
/**
* Reads a little-endian <tt>float</tt> value.
* @throws java.io.IOException if an error occurs
* @return <tt>float</tt> value with reversed byte order
*/
public float readFloatLE() throws IOException {
int i = readIntLE();
float ret = Float.intBitsToFloat(i);
return ret;
}
/**
* Reads a little-endian <tt>long</tt> value.
* @throws java.io.IOException if an error occurs
* @return <tt>long</tt> value with reversed byte order
*/
public long readLongLE() throws IOException {
int i1 = readIntLE();
int i2 = readIntLE();
long ret = ((long)(i1) << 32) + (i2 & 0xFFFFFFFFL);
return ret;
}
/**
* Reads a little-endian <tt>double</tt> value.
* @throws java.io.IOException if an error occurs
* @return <tt>double</tt> value with reversed byte order
*/
public double readDoubleLE() throws IOException {
long l = readLongLE();
double ret = Double.longBitsToDouble(l);
return ret;
}
/**
* @since 0.6
*/
public long readUnsignedInt() throws IOException {
long i1 = readUnsignedByte();
long i2 = readUnsignedByte();
long i3 = readUnsignedByte();
long i4 = readUnsignedByte();
long ret = ((i1 << 24) | (i2 << 16) | (i3 << 8) | i4);
return ret;
}
/**
* @since 0.6
*/
public long readUnsignedIntLE() throws IOException {
long i1 = readUnsignedByte();
long i2 = readUnsignedByte();
long i3 = readUnsignedByte();
long i4 = readUnsignedByte();
long ret = (i4 << 24) | (i3 << 16) | (i2 << 8) | i1;
return ret;
}
}