fixed bug in LittleEndianByteArrayInputStream.readFully()

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@836298 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2009-11-15 00:27:59 +00:00
parent 00e64461a9
commit d8f3c6de71
2 changed files with 33 additions and 7 deletions

View File

@ -18,9 +18,8 @@
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 {
@ -60,7 +59,7 @@ 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;
@ -71,7 +70,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
public long readLong() {
checkPosition(8);
int i = _readIndex;
int b0 = _buf[i++] & 0xFF;
int b1 = _buf[i++] & 0xFF;
int b2 = _buf[i++] & 0xFF;
@ -100,7 +99,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
public int readUShort() {
checkPosition(2);
int i = _readIndex;
int b0 = _buf[i++] & 0xFF;
int b1 = _buf[i++] & 0xFF;
_readIndex = i;
@ -108,7 +107,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
}
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) {

View File

@ -19,7 +19,9 @@ package org.apache.poi.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
/**
@ -50,4 +52,29 @@ public final class TestLittleEndianStreams extends 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());
}
}