public int encode(byte[] data,int off,int length,OutputStream out) throws IOException {
  int modulus=length % 3;
  int dataLength=(length - modulus);
  int a1;
  int a2;
  int a3;
  for (int i=off; i < (off + dataLength); i+=3) {
    a1=data[i] & 0xff;
    a2=data[i + 1] & 0xff;
    a3=data[i + 2] & 0xff;
    out.write(encodingTable[(a1 >>> 2) & 0x3f]);
    out.write(encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]);
    out.write(encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]);
    out.write(encodingTable[a3 & 0x3f]);
  }
  int b1;
  int b2;
  int b3;
  int d1;
  int d2;
switch (modulus) {
case 0:
    break;
case 1:
  d1=data[off + dataLength] & 0xff;
b1=(d1 >>> 2) & 0x3f;
b2=(d1 << 4) & 0x3f;
out.write(encodingTable[b1]);
out.write(encodingTable[b2]);
out.write(padding);
out.write(padding);
break;
case 2:
d1=data[off + dataLength] & 0xff;
d2=data[off + dataLength + 1] & 0xff;
b1=(d1 >>> 2) & 0x3f;
b2=((d1 << 4) | (d2 >>> 4)) & 0x3f;
b3=(d2 << 2) & 0x3f;
out.write(encodingTable[b1]);
out.write(encodingTable[b2]);
out.write(encodingTable[b3]);
out.write(padding);
break;
}
return ((dataLength / 3) * 4) + ((modulus == 0) ? 0 : 4);
}

public int encode ( byte [ ] data , int off , int length , OutputStream out ) throws IOException { int modulus = length % 3 ; int dataLength = ( length - modulus ) ; int a1 ; int a2 ; int a3 ; for ( int i = off ; i < ( off + dataLength ) ; i += 3 ) { a1 = data [ i ] & 0xff ; a2 = data [ i + 1 ] & 0xff ; a3 = data [ i + 2 ] & 0xff ; out . write ( encodingTable [ ( a1 > > > 2 ) & 0x3f ] ) ; out . write ( encodingTable [ ( ( a1 << 4 ) | ( a2 > > > 4 ) ) & 0x3f ] ) ; out . write ( encodingTable [ ( ( a2 << 2 ) | ( a3 > > > 6 ) ) & 0x3f ] ) ; out . write ( encodingTable [ a3 & 0x3f ] ) ; } int b1 ; int b2 ; int b3 ; int d1 ; int d2 ; switch ( modulus ) { case 0 : break ; case 1 : d1 = data [ off + dataLength ] & 0xff ; b1 = ( d1 > > > 2 ) & 0x3f ; b2 = ( d1 << 4 ) & 0x3f ; out . write ( encodingTable [ b1 ] ) ; out . write ( encodingTable [ b2 ] ) ; out . write ( padding ) ; out . write ( padding ) ; break ; case 2 : d1 = data [ off + dataLength ] & 0xff ; d2 = data [ off + dataLength + 1 ] & 0xff ; b1 = ( d1 > > > 2 ) & 0x3f ; b2 = ( ( d1 << 4 ) | ( d2 > > > 4 ) ) & 0x3f ; b3 = ( d2 << 2 ) & 0x3f ; out . write ( encodingTable [ b1 ] ) ; out . write ( encodingTable [ b2 ] ) ; out . write ( encodingTable [ b3 ] ) ; out . write ( padding ) ; break ; } return ( ( dataLength / 3 ) * 4 ) + ( ( modulus == 0 ) ? 0 : 4 ) ; }
encode the input data producing a base 64 output stream .
