Eu tenho uma imagem que está codificada na Base64. Qual é a melhor maneira de descodificar isso em Java? Esperemos que usando apenas as bibliotecas incluídas com o Sun Java 6.
Não há necessidade de usar um codificador base64 com Java. Você pode importá-lo como tal:
import sun.misc.BASE64Decoder;
E depois usa-o assim:
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);
Onde encodedBytes
é ou um java.lang.String
ou um java.io.InputStream
. Cuidado que as classes sun.*
não são "oficialmente suportadas" por Sun.
EDIT: Quem diria que esta seria a resposta mais controversa que eu'd alguma vez postei? Eu sei que os pacotes sun.* não são suportados ou garantidos para continuar existindo, e eu sei sobre o Commons e usá-lo o tempo todo. Entretanto, o poster pediu uma classe que foi "incluída com Sun Java 6," e isso'é o que eu estava tentando responder. Eu concordo que o Commons é a melhor maneira de ir em geral.
EDIT 2: Como amir75 aponta abaixo, Java 6+ vem com JAXB, que contém código suportado para codificar/decodificar Base64. Veja Jeremy Ross' resposta abaixo.
Especificamente em Commons Codec: classe Base64
para decode(byte[] array)
ou encode(byte[] array)
Como alternativa ao sun.misc.BASE64Decoder
ou bibliotecas não centrais, veja javax.mail.internet.MimeUtility.decode()
.
public static byte[] encode(byte[] b) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream b64os = MimeUtility.encode(baos, "base64");
b64os.write(b);
b64os.close();
return baos.toByteArray();
}
public static byte[] decode(byte[] b) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(b);
InputStream b64is = MimeUtility.decode(bais, "base64");
byte[] tmp = new byte[b.length];
int n = b64is.read(tmp);
byte[] res = new byte[n];
System.arraycopy(tmp, 0, res, 0, n);
return res;
}
Ligar com o código completo: Codificar/Decodificar para/de Base64