brouter/brouter-util/src/main/java/btools/util/DiffCoderDataInputStream.java
2022-07-25 06:14:46 +02:00

43 lines
916 B
Java

/**
* 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;
}
}