package uk.co.mmscomputing.io; import java.io.*; public class RLEBitInputStream extends FilterInputStream{ private int rlen; // the run length private int ccw; // the current code word private boolean invert=false; public RLEBitInputStream(InputStream in){ super(in); resetToStartCodeWord(); } public void resetToStartCodeWord(){ccw=1;rlen=0;} public void setInvert(boolean invert){this.invert=invert;} public int read(byte[] b,int off,int len)throws IOException{ for(int i=0;i<len;i++){ int v=read(); if(v==-1){return (i==0)?-1:i;} b[off+i]=(byte)v; } return len; } public int readBits(int end,int start)throws IOException{ int b=0; for(int i=end;i>=start;i--){ while(rlen==0){ rlen=in.read(); // can be 32 bit number if(rlen==-1){return -1;} // end of stream ccw=(ccw+1)&0x01; // change current code word } rlen--; if(ccw!=1){b|=(1<<i);} } return (invert)?((~b)&0x00FF):b; } public int read()throws IOException{ int b=0; for(int i=7;i>=0;i--){ while(rlen==0){ rlen=in.read(); // can be 32 bit number if(rlen==-1){return -1;} // end of stream ccw=(ccw+1)&0x01; // change current code word } rlen--; if(ccw!=1){b|=(1<<i);} } return (invert)?((~b)&0x00FF):b; } }