Example #1
0
  /**
   * 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;
  }