/** * Base64-encode the given data and return a newly allocated byte[] with the result. * * @param input the data to encode * @param offset the position within the input array at which to start * @param len the number of bytes of input to encode * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results * in output that adheres to RFC 2045. * @return base64 encoded input as bytes */ public static byte[] encode(byte[] input, int offset, int len, int flags) { Encoder encoder = new Encoder(flags, null); // Compute the exact length of the array we will produce. int output_len = len / 3 * 4; // Account for the tail of the data and the padding bytes, if any. if (encoder.do_padding) { if (len % 3 > 0) { output_len += 4; } } else { switch (len % 3) { case 0: break; case 1: output_len += 2; break; case 2: output_len += 3; break; } } // Account for the newlines, if any. if (encoder.do_newline && len > 0) { output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) * (encoder.do_cr ? 2 : 1); } encoder.output = new byte[output_len]; encoder.process(input, offset, len, true); if (BuildConfig.DEBUG && encoder.op != output_len) { throw new AssertionError(); } return encoder.output; }