X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.graph%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Frepresentation%2FByteFileReader.java;fp=bundles%2Forg.simantics.graph%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Frepresentation%2FByteFileReader.java;h=e930a00fcad35b9c36bc323bd119c165f8f495dc;hp=4c14bded6639fbf0662e6548f486d38dd27be912;hb=69d8f2b115a832560eca0d56903c8977178b71ab;hpb=9ea5cf59a4d87c3db3a486e86d7b54efffd5516d diff --git a/bundles/org.simantics.graph/src/org/simantics/graph/representation/ByteFileReader.java b/bundles/org.simantics.graph/src/org/simantics/graph/representation/ByteFileReader.java index 4c14bded6..e930a00fc 100644 --- a/bundles/org.simantics.graph/src/org/simantics/graph/representation/ByteFileReader.java +++ b/bundles/org.simantics.graph/src/org/simantics/graph/representation/ByteFileReader.java @@ -69,9 +69,7 @@ public class ByteFileReader implements Closeable { } final protected byte[] safeBytes(int amount) throws IOException { - byte[] result = new byte[amount]; - int has = size-byteIndex; if(amount >= has) { ReadableByteChannel c = channel; @@ -86,6 +84,9 @@ public class ByteFileReader implements Closeable { int got = c.read(bb2); if(got == -1) throw new IOException("Unexpected end-of-file"); has += got; + // For some unknown reason this is needed! + // Spec indicates that read would increment position but it does not. + bb2.position(has); } size = c.read(bb); bb.position(0); @@ -104,7 +105,7 @@ public class ByteFileReader implements Closeable { int result; if(has == 0) { ReadableByteChannel c = channel; - ByteBuffer bb = byteBuffer; + ByteBuffer bb = byteBuffer; size = c.read(bb); if(size == -1) { throw new EOFException("Unexpected end-of-file"); @@ -114,43 +115,40 @@ public class ByteFileReader implements Closeable { if(size == 0) return -1; } - result = bytes[byteIndex]; - if(result < 0) - result += 256; - ++byteIndex; + result = bytes[byteIndex++] & 0xff; return result; } public int getDynamicUInt32() throws IOException { - int length = getByte()&0xff; + int length = getByte(); if(length >= 0x80) { if(length >= 0xc0) { if(length >= 0xe0) { if(length >= 0xf0) { length &= 0x0f; - length += ((getByte()&0xff)<<3); - length += ((getByte()&0xff)<<11); - length += ((getByte()&0xff)<<19); + length += (getByte()<<3); + length += (getByte()<<11); + length += (getByte()<<19); length += 0x10204080; } else { length &= 0x1f; - length += ((getByte()&0xff)<<4); - length += ((getByte()&0xff)<<12); - length += ((getByte()&0xff)<<20); + length += (getByte()<<4); + length += (getByte()<<12); + length += (getByte()<<20); length += 0x204080; } } else { length &= 0x3f; - length += ((getByte()&0xff)<<5); - length += ((getByte()&0xff)<<13); + length += (getByte()<<5); + length += (getByte()<<13); length += 0x4080; } } else { length &= 0x7f; - length += ((getByte()&0xff)<<6); + length += (getByte()<<6); length += 0x80; } } @@ -159,10 +157,12 @@ public class ByteFileReader implements Closeable { final protected int safeInt() throws IOException { + byte[] bytes = this.bytes; + if(byteIndex >= (size-5)) { int result = 0; ReadableByteChannel c = channel; - ByteBuffer bb = byteBuffer; + ByteBuffer bb = byteBuffer; if(byteIndex == size) { size = c.read(bb); if(size == -1) throw new EOFException("Unexpected end-of-file"); @@ -190,7 +190,7 @@ public class ByteFileReader implements Closeable { bb.position(0); byteIndex = 0; } - result |= ((int)(bytes[byteIndex++]&0xff)<<0); + result |= ((int)(bytes[byteIndex++]&0xff)); if(byteIndex == size) { size = c.read(bb); bb.position(0); @@ -200,9 +200,9 @@ public class ByteFileReader implements Closeable { } else { return ((bytes[byteIndex++]&0xff)<<24) | ((bytes[byteIndex++]&0xff)<<16) | ((bytes[byteIndex++]&0xff)<<8) | ((bytes[byteIndex++]&0xff)); } - + } - + final protected int getSize() { return size; }