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:
parent
00e64461a9
commit
d8f3c6de71
@ -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) {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user