/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * muCommander is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.commons.io.base64; import java.io.*; /** * <code>Base64Decoder</code> provides methods to ease the decoding of strings and byte arrays in base64. * The {@link Base64InputStream} class is used under the hood to perform the actual base64 decoding. * * @see Base64InputStream * @author Maxence Bernard */ public abstract class Base64Decoder { /** * Shorthand for {@link #decodeAsBytes(String, Base64Table)} invoked with {@link Base64Table#STANDARD_TABLE}. * * @param s a Base64-encoded String * @return the decoded string as a byte array * @throws java.io.IOException if the given String isn't properly Base64-encoded */ public static byte[] decodeAsBytes(String s) throws IOException { return decodeAsBytes(s, Base64Table.STANDARD_TABLE); } /** * Decodes the given Base64-encoded string and returns the result as a byte array. * Throws an <code>IOException</code> if the String isn't properly Base64-encoded. * * @param s a Base64-encoded String * @param table the table to use to decode data * @return the decoded string as a byte array * @throws java.io.IOException if the given String isn't properly Base64-encoded */ public static byte[] decodeAsBytes(String s, Base64Table table) throws IOException { byte[] b = s.getBytes(); if(b.length%4 != 0) { // Base64 encoded data must come in a multiple of 4 bytes, throw an IOException if it's not the case throw new IOException("Byte array length is not a multiple of 4"); } Base64InputStream bin = new Base64InputStream(new ByteArrayInputStream(b), table); ByteArrayOutputStream bout = new ByteArrayOutputStream(); int i; try { while((i=bin.read())!=-1) bout.write(i); return bout.toByteArray(); } finally { bin.close(); } } /** * Decodes the given Base64-encoded string and returns the result as a String. The specified encoding is used for * transforming the decoded bytes into a String. Throws an <code>IOException</code> if the String isn't properly * Base64-encoded, or if the encoding is not supported by the Java runtime. * * @param s a Base64-encoded String * @param encoding the character encoding to use for transforming the decoded bytes into a String * @param table the table to use to decode data * @return the decoded String * @throws UnsupportedEncodingException if the specified encoding is not supported by the Java runtime * @throws java.io.IOException if the given String isn't properly Base64-encoded */ public static String decode(String s, String encoding, Base64Table table) throws UnsupportedEncodingException, IOException { InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(decodeAsBytes(s, table)), encoding); StringBuffer sb = new StringBuffer(); int i; try { while((i=isr.read())!=-1) sb.append((char)i); return sb.toString(); } finally { isr.close(); } } /** * Shorthand for {@link #decode(String, String, Base64Table)} invoked with <code>UTF-8</code> encoding and * {@link Base64Table#STANDARD_TABLE}. * * @param s a Base64-encoded String * @return the decoded String * @throws java.io.IOException if the given String isn't properly Base64-encoded */ public static String decode(String s) throws IOException { return decode(s, "UTF-8", Base64Table.STANDARD_TABLE); } }