public static String encode ( final byte [ ] in ) { int modulus = 0 ; int bitWorkArea = 0 ; int numEncodedBytes = ( in . length / BYTES_PER_UNENCODED_BLOCK ) * BYTES_PER_ENCODED_BLOCK + ( ( in . length % BYTES_PER_UNENCODED_BLOCK == 0 ) ? 0 : 4 ) ; byte [ ] buffer = new byte [ numEncodedBytes ] ; int pos = 0 ; for ( int b : in ) { modulus = ( modulus + 1 ) % BYTES_PER_UNENCODED_BLOCK ; if ( b < 0 ) { b += 256 ; } bitWorkArea = ( bitWorkArea << 8 ) + b ; // BITS_PER_BYTE if ( 0 == modulus ) { // 3 bytes = 24 bits = 4 * 6 bits to extract buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 18 ) & SIX_BIT_MASK ] ; buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 12 ) & SIX_BIT_MASK ] ; buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 6 ) & SIX_BIT_MASK ] ; buffer [ pos ++ ] = ENCODE_TABLE [ bitWorkArea & SIX_BIT_MASK ] ; } } switch ( modulus ) { // 0-2 case 1 : // 8 bits = 6 + 2 buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 2 ) & SIX_BIT_MASK ] ; // top 6 bits buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea << 4 ) & SIX_BIT_MASK ] ; // remaining 2 buffer [ pos ++ ] = PAD ; buffer [ pos ] = PAD ; // Last entry no need to ++ break ; case 2 : // 16 bits = 6 + 6 + 4 buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 10 ) & SIX_BIT_MASK ] ; buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea >> 4 ) & SIX_BIT_MASK ] ; buffer [ pos ++ ] = ENCODE_TABLE [ ( bitWorkArea << 2 ) & SIX_BIT_MASK ] ; buffer [ pos ] = PAD ; // Last entry no need to ++ break ; default : break ; } return byteArrayToString ( buffer ) ; }
Encodes the given byte array into a Base64 - encoded string .