package org.apache.poi.util;
/**
- * Adapts a plain byte array to {@link LittleEndianInput}
- *
- *
+ * Adapts a plain byte array to {@link LittleEndianInput}
+ *
* @author Josh Micich
*/
public final class LittleEndianByteArrayInputStream implements LittleEndianInput {
public int readInt() {
checkPosition(4);
int i = _readIndex;
-
+
int b0 = _buf[i++] & 0xFF;
int b1 = _buf[i++] & 0xFF;
int b2 = _buf[i++] & 0xFF;
public long readLong() {
checkPosition(8);
int i = _readIndex;
-
+
int b0 = _buf[i++] & 0xFF;
int b1 = _buf[i++] & 0xFF;
int b2 = _buf[i++] & 0xFF;
public int readUShort() {
checkPosition(2);
int i = _readIndex;
-
+
int b0 = _buf[i++] & 0xFF;
int b1 = _buf[i++] & 0xFF;
_readIndex = i;
}
public void readFully(byte[] buf, int off, int len) {
checkPosition(len);
- System.arraycopy(_buf, _readIndex, _buf, off, len);
+ System.arraycopy(_buf, _readIndex, buf, off, len);
_readIndex+=len;
}
public void readFully(byte[] buf) {
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
/**
assertEquals(1234567890123456789L, lei.readLong());
assertEquals(123.456, lei.readDouble(), 0.0);
}
+
+ /**
+ * Up until svn r836101 {@link LittleEndianByteArrayInputStream#readFully(byte[], int, int)}
+ * had an error which resulted in the data being read and written back to the source byte
+ * array.
+ */
+ public void testReadFully() {
+ byte[] srcBuf = HexRead.readFromString("99 88 77 66 55 44 33");
+ LittleEndianInput lei = new LittleEndianByteArrayInputStream(srcBuf);
+
+ // do initial read to increment the read index beyond zero
+ assertEquals(0x8899, lei.readUShort());
+
+ byte[] actBuf = new byte[4];
+ lei.readFully(actBuf);
+
+ if (actBuf[0] == 0x00 && srcBuf[0] == 0x77 && srcBuf[3] == 0x44) {
+ throw new AssertionFailedError("Identified bug in readFully() - source buffer was modified");
+ }
+
+ byte[] expBuf = HexRead.readFromString("77 66 55 44");
+ assertTrue(Arrays.equals(actBuf, expBuf));
+ assertEquals(0x33, lei.readUByte());
+ assertEquals(0, lei.available());
+ }
}