import java.io.InputStream;
public final class BitStream {
private final int RESELEN = 4096;//默认缓冲区大小
private InputStream in;//输入流
private byte[] bitBuf;//提高处理 缓冲区
private int bitPos; //位位置
private int bytePos;//字节位置
private int endPos; //bitBuf已填入的字节数
public BitStream(InputStream in) {
this.in = in;
bitBuf = new byte[RESELEN + 4]; // 长度不小于(最大帧长)
}
public BitStream(InputStream in,int size) {
this.in = in;
bitBuf = new byte[size + 4]; // 长度不小于size(最大帧长)
}
/**
* <p>
* 简述:向bitBuf添加len字节,RESELEN后尾部要空出4字节用于32bit的"2级缓冲".
* </p>
*/
public int append(int len) {
if (len + endPos > RESELEN) {
//将缓冲区bytePos及之后的字节移动到缓冲区首
System.arraycopy(bitBuf, bytePos, bitBuf, 0, endPos
- bytePos);
endPos -= bytePos;
bitPos = bytePos = 0;
}
try {
if(in.read(bitBuf, endPos, len)==-1)
return -1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
endPos += len;
return len;
}
/**
* <p>
* 简述:重置 bitstream
* </p>
*/
public void resetIndex() {
bytePos = bitPos = endPos = 0;
}
/**
* <p>
* 简述:从缓冲区bitBuf读取1 bit
* </p>
*/
public int get1Bit() {
int bit = bitBuf[bytePos] << bitPos;
bit >>= 7;
bit &= 0x1;
bitPos++;
bytePos += bitPos >> 3;
bitPos &= 0x7;
return bit;
}
/**
*
* <p>
* 简述:2 <= n <= 17
* </p>
*/
public int getBits17(int n) {
int iret = bitBuf[bytePos];
iret <<= 8;
iret |= bitBuf[bytePos + 1] & 0xff;
iret <<= 8;
iret |= bitBuf[bytePos + 2] & 0xff;
iret <<= bitPos;
iret &= 0xffffff; // 高8位置0;
iret >>= 24 - n;
bitPos += n;
bytePos += bitPos >> 3;
bitPos &= 0x7;
return iret;
}
http://lfp001.iteye.com/blog/412745