/** * DataInputStream extended by varlength diff coding * * @author ab */ package btools.util; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; public final class DiffCoderDataInputStream extends DataInputStream { private long[] lastValues = new long[10]; public DiffCoderDataInputStream(InputStream is) { super(is); } public long readDiffed(int idx) throws IOException { long d = readSigned(); long v = lastValues[idx] + d; lastValues[idx] = v; return v; } public long readSigned() throws IOException { long v = readUnsigned(); return (v & 1) == 0 ? v >> 1 : -(v >> 1); } public long readUnsigned() throws IOException { long v = 0; int shift = 0; for (; ; ) { long i7 = readByte() & 0xff; v |= ((i7 & 0x7f) << shift); if ((i7 & 0x80) == 0) break; shift += 7; } return v; } }