package uk.co.mmscomputing.io; import java.io.*; public class PackBitsInputStream extends FilterInputStream{ private byte n; private int b; public PackBitsInputStream(InputStream in){ super(in); n=-128; } public int read()throws IOException{ while(n==-128){ // read next counter if n=-128 b=in.read(); if(b==-1){return -1;} // end of stream n=(byte)b; if((-128<n)&&(n<0)){ b=in.read(); // cache value n--; break; } } if(0<=n){ // [0 .. 127] if(n==0){ n=-128; // read counter n, next time }else{ n--; } return in.read(); // copy next byte in stream } // [-127 .. -1] if(n==-1){ n=-128; // read counter n, next time }else{ n++; } return b; // return cached byte } 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 static void main(String[] args){ try{ int b,i=0; // unpacked: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA byte[] data={(byte)0xFE, (byte)0xAA, (byte)0x02, (byte)0x80, (byte)0x00, (byte)0x2A, (byte)0xFD, (byte)0xAA, (byte)0x03, (byte)0x80, (byte)0x00, (byte)0x2A, (byte)0x22, (byte)0xF7, (byte)0xAA }; InputStream in=new PackBitsInputStream(new ByteArrayInputStream(data)); while((b=in.read())!=-1){ System.err.print(" "+Integer.toHexString(b));i++; // System.err.println("["+i+"]=0x"+Integer.toHexString(b));i++; } in.close(); }catch(Exception e){ System.out.println(e); } } } /* http://developer.apple.com/technotes/tn/tn1023.html last accessed: 2005-07-25 Adobe TIFF6.PDF p.42 */