1 36 package org.columba.ristretto.coder; 37 38 39 import java.io.FilterInputStream ; 40 import java.io.IOException ; 41 import java.io.InputStream ; 42 43 51 public class Base64EncoderInputStream extends FilterInputStream { 52 53 54 private static final byte[] table = { 55 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 56 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 57 85, 86, 87, 88, 89, 90, 97, 98, 99,100, 58 101,102,103,104,105,106,107,108,109,110, 59 111,112,113,114,115,116,117,118,119,120, 60 121,122, 48, 49, 50, 51, 52, 53, 54, 55, 61 56, 57, 43, 47 }; 62 63 private byte[] outBytes; 64 private byte[] inBytes; 65 private int blockCount; 66 private int pos; 67 private int available; 68 69 74 public Base64EncoderInputStream( InputStream in ) 75 { 76 super(in); 77 outBytes = new byte[4]; 78 inBytes = new byte[3]; 79 } 80 81 82 83 90 private int encodeNextPack() throws IOException { 91 if( blockCount == 24) { 92 outBytes[0] = '\r'; 93 outBytes[1] = '\n'; 94 blockCount = 0; 95 return 2; 96 } 97 98 int read = in.read( inBytes ); 99 100 if( read == 3 ) { 101 outBytes[0] = table[(byte)(0x03F & (inBytes[0]>>2))]; 102 outBytes[1] = table[(byte)((0x03F & (inBytes[0]<<4)) | (0x00F & (inBytes[1]>>4)))]; 103 outBytes[2] = table[(byte)((0x03F & (inBytes[1]<<2)) | (0x003 & (inBytes[2]>>6)))]; 104 outBytes[3] = table[(byte)(0x03F & inBytes[2])]; 105 106 blockCount++; 107 } else if (read > 0){ 108 109 outBytes[0] = table[(byte)(0x03F & (inBytes[0]>>2))]; 110 111 if( read == 2 ) { 112 outBytes[1] = table[(byte)((0x03F & (inBytes[0]<<4)) | (0x00F & (inBytes[1]>>4)))]; 113 outBytes[2] = table[(byte)(0x03F & (inBytes[1]<<2) )]; 114 outBytes[3] = '='; 115 } else { 116 outBytes[1] = table[(byte)(0x03F & (inBytes[0]<<4))]; 117 outBytes[2] = '='; 118 outBytes[3] = '='; 119 } 120 } else { 121 return -1; 122 } 123 124 return 4; 125 } 126 127 130 public int read() throws IOException { 131 if( pos == available ) { 132 available = encodeNextPack(); 133 pos = 0; 134 } 135 136 if( available == -1) return -1; 137 138 return outBytes[pos++]; 139 } 140 141 144 public int read(byte[] arg0, int arg1, int arg2) throws IOException { 145 int next; 146 for( int i=0; i<arg2; i++) { 147 next = read(); 148 if( next == -1 ) { 149 if( i == 0 ) { 150 return -1; 151 } else { 152 return i; 153 } 154 } 155 arg0[arg1+i] = (byte) next; 156 } 157 return arg2; 158 } 159 160 161 164 public int available() throws IOException { 165 return (int) (in.available() * 1.33); 166 } 167 168 } 169 | Popular Tags |