Decodificar datos Base64 en Java

Resuelto Ryan P asked hace 15 años • 21 respuestas

Tengo una imagen codificada en Base64. ¿Cuál es la mejor manera de decodificar eso en Java? Con suerte, usar solo las bibliotecas incluidas con Sun Java 6.

Ryan P avatar Jan 22 '09 22:01 Ryan P
Aceptado

A partir de Java 8 , existe una API oficialmente compatible para la codificación y decodificación Base64. Con el tiempo, esta probablemente se convertirá en la opción predeterminada.

La API incluye la clase java.util.Base64y sus clases anidadas. Admite tres versiones diferentes: básico, seguro para URL y MIME.

Código de muestra usando la codificación "básica":

import java.util.Base64;

byte[] bytes = "Hello, World!".getBytes("UTF-8");
String encoded = Base64.getEncoder().encodeToString(bytes);
byte[] decoded = Base64.getDecoder().decode(encoded);
String decodedStr = new String(decoded, StandardCharsets.UTF_8);

La documentaciónjava.util.Base64 incluye varios métodos más para configurar codificadores y decodificadores, y para usar diferentes clases como entradas y salidas (matrices de bytes, cadenas, ByteBuffers, secuencias java.io).

Andrea avatar Mar 26 '2013 20:03 Andrea

A partir de la versión 6, Java SE se entrega con JAXB. javax.xml.bind.DatatypeConvertertiene métodos estáticos que facilitan esto. Ver parseBase64Binary()y printBase64Binary().

ACTUALIZACIÓN : JAXB ya no se incluye con Java (desde Java 11). Si se requiere JAXB para su proyecto, deberá configurar las bibliotecas relevantes a través de su sistema de gestión de dependencias, por ejemplo Maven. Si necesita el compilador ( xjc.exe), también deberá descargarlo por separado.

Jeremy Ross avatar Jan 13 '2010 03:01 Jeremy Ross

No es necesario utilizar commons: Sun incluye un codificador base64 con Java. Puedes importarlo como tal:

import sun.misc.BASE64Decoder;

Y luego úsalo así:

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);

¿ Dónde encodedBytesestá a java.lang.Stringo a java.io.InputStream? Sólo tenga en cuenta que las sun.*clases no cuentan con el "apoyo oficial" de Sun.

EDITAR: ¿Quién hubiera imaginado que esta sería la respuesta más controvertida que jamás publicaría? Sé que los paquetes sun.* no son compatibles ni se garantiza que sigan existiendo, y conozco Commons y lo uso todo el tiempo. Sin embargo, el cartel pedía una clase que estuviera "incluida con Sun Java 6", y eso es lo que estaba tratando de responder. Estoy de acuerdo en que la Cámara de los Comunes es el mejor camino a seguir en general.

EDITAR 2: Como señala amir75 a continuación, Java 6+ se entrega con JAXB, que contiene código compatible para codificar/decodificar Base64. Consulte la respuesta de Jeremy Ross a continuación.

MattK avatar Jan 22 '2009 16:01 MattK