| BitBuffer |

    package ij.io;

    /**
     * A class for reading arbitrary numbers of bits from a byte array.
     * @author Eric Kjellman egkjellman at wisc.edu
     */
    public class BitBuffer {

        private int currentByte;
        private int currentBit;
        private byte[] byteBuffer;
        private int eofByte;
        private int[] backMask;
        private int[] frontMask;
        private boolean eofFlag;

        public BitBuffer(byte[] byteBuffer) {
            this.byteBuffer = byteBuffer;
            currentByte = 0;
            currentBit = 0;
            eofByte = byteBuffer.length;
            backMask = new int[] {0x0000, 0x0001, 0x0003, 0x0007,
                0x000F, 0x001F, 0x003F, 0x007F};
            frontMask = new int[] {0x0000, 0x0080, 0x00C0, 0x00E0,
                0x00F0, 0x00F8, 0x00FC, 0x00FE};
        }

        public int getBits(int bitsToRead) {
            if (bitsToRead == 0)
                return 0;
            if (eofFlag)
                return -1; // Already at end of file
            int toStore = 0;
            while(bitsToRead != 0  && !eofFlag) {
                if (bitsToRead >= 8 - currentBit) {
                    if (currentBit == 0) { // special
                        toStore = toStore << 8;
                        int cb = ((int) byteBuffer[currentByte]);
                        toStore += (cb<0 ? (int) 256 + cb : (int) cb);
                        bitsToRead -= 8;
                        currentByte++;
                    } else {
                        toStore = toStore << (8 - currentBit);
                        toStore += ((int) byteBuffer[currentByte]) & backMask[8 - currentBit];
                        bitsToRead -= (8 - currentBit);
                        currentBit = 0;
                        currentByte++;
                    }
                } else {
                    toStore = toStore << bitsToRead;
                    int cb = ((int) byteBuffer[currentByte]);
                    cb = (cb<0 ? (int) 256 + cb : (int) cb);
                    toStore += ((cb) & (0x00FF - frontMask[currentBit])) >> (8 - (currentBit + bitsToRead));
                    currentBit += bitsToRead;
                    bitsToRead = 0;
                }
                if (currentByte == eofByte) {
                    eofFlag = true;
                    return toStore;
                }
            }
            return toStore;
        }

    }

| BitBuffer |