package Utils; public class BitReader { public byte[] data; public int byteSize; public int bitPos; public BitReader() { this.data = null; this.byteSize = 0; this.bitPos = 0; } public void reset(byte[] data, int offset, int length) { this.data = data; this.byteSize = Math.min(data.length, length); this.bitPos = offset * 8; } public int getBits(int nBits) { if (nBits <= 0 || nBits > 32) throw new IllegalArgumentException(); if (bitPos + nBits > byteSize * 8) return -1; int bits = 0; while (nBits > 0) { int bytePos = (bitPos & 7); if (bytePos != 0) { int leftover = 8 - bytePos; int n = this.data[bitPos >>> 3] & ((1 << leftover) - 1); if (nBits < leftover) { bits <<= nBits; bits |= n >>> (leftover - nBits); this.bitPos += nBits; nBits = 0; } else { bits <<= leftover; bits |= n; this.bitPos += leftover; nBits -= leftover; } } else { if (nBits < 8) { bits <<= nBits; bits |= (this.data[bitPos >>> 3] & 0xff) >>> (8 - nBits); this.bitPos += nBits; nBits = 0; } else { bits <<= 8; bits |= this.data[bitPos >>> 3] & 0xff; this.bitPos += 8; nBits -= 8; } } } return bits; } }