package uk.co.mmscomputing.sms; import java.io.*; public class SMS7BitOutputStream extends FilterOutputStream{ private int bitbuf; private int bitCount; public SMS7BitOutputStream(OutputStream out){ super(out); bitbuf=0; bitCount=0; } public void write(int b)throws IOException{ bitbuf |= (b&0x007F) << bitCount; bitCount+=7; while(bitCount>=8){ b = bitbuf & 0x00FF; bitCount -=8; bitbuf >>= 8; out.write(b); } } public void write(byte[] b)throws IOException{ write(b,0,b.length); } public void write(byte[] b,int off,int len)throws IOException{ for(int i=0;i<len;i++){write(b[off+i]);} } public void flush()throws IOException{ if(bitCount>0){ write(-1); bitCount=0; } // super.flush(); // DON'T flush SMS..OutputStream here ! } public static void main(String[] argv){ try{ String s="Hello Michael"; ByteArrayOutputStream baos=new ByteArrayOutputStream(); SMS7BitOutputStream out=new SMS7BitOutputStream(baos); out.write(s.getBytes()); out.flush(); ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray()); SMS7BitInputStream in=new SMS7BitInputStream(bais); byte[] bytes=new byte[256]; int len=in.read(bytes); System.err.println("len = "+len); System.err.println(new String(bytes,0,len)); }catch(Exception e){ e.printStackTrace(); } } } // [1] ETSI TS 123 040 (2004-09) // [2] 3GPP TS 23.038 V7.0.0 (2006-03)