getbytes - java 8 base64
Codificación Base64 en Java (16)
Aquí están mis dos centavos ... Java 8 contiene su propia implementación de Base64
. Sin embargo, encontré una diferencia ligeramente inquietante. Para ilustrar, daré un ejemplo de código:
Mi envoltorio CODEC:
public interface MyCodec
{
static String apacheDecode(String encodedStr)
{
return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8"));
}
static String apacheEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return Base64.encodeBase64String(decodedByteArr);
}
static String javaDecode(String encodedStr)
{
return new String(java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8"));
}
static String javaEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return java.util.Base64.getEncoder().encodeToString(decodedByteArr);
}
}
Clase de prueba:
public class CodecDemo
{
public static void main(String[] args)
{
String decodedText = "Hello World!";
String encodedApacheText = MyCodec.apacheEncode(decodedText);
String encodedJavaText = MyCodec.javaEncode(decodedText);
System.out.println("Apache encoded text: " + MyCodec.apacheEncode(encodedApacheText));
System.out.println("Java encoded text: " + MyCodec.javaEncode(encodedJavaText));
System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText));
System.out.println("Apache decode Java: " + MyCodec.apacheDecode(encodedJavaText));
System.out.println("Java decode Java: " + MyCodec.javaDecode(encodedJavaText));
System.out.println("Apache decode Apache: " + MyCodec.apacheDecode(encodedApacheText));
System.out.println("Java decode Apache: " + MyCodec.javaDecode(encodedApacheText));
}
}
SALIDA:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: false
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character d
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
Observe que el texto codificado de Apache contiene saltos de línea adicionales (espacios en blanco) al final. Por lo tanto, para que mi CODEC produzca el mismo resultado independientemente de la implementación de Base64, tuve que llamar a trim()
en el texto codificado de Apache. En mi caso, simplemente agregué la llamada al método antes mencionado al apacheDecode()
mi CODEC de la siguiente manera:
return Base64.encodeBase64String(decodedByteArr).trim();
Una vez que se realizó este cambio, los resultados son los que esperaba comenzar:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: true
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Java decode Apache: Hello World!
Tal vez alguien podría comentar por qué esto es así, pero encontré mi solución como un compromiso aceptable.
Estoy usando Eclipse. Tengo la siguiente línea de código:
wr.write(new sun.misc.BASE64Encoder().encode(buf));
Eclipse marca esta línea como un error. He importado las bibliotecas requeridas:
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
Pero de nuevo, ambos se muestran como errores. Encontré un post similar aquí .
Usé Apache Commons como la solución sugerida al incluir:
import org.apache.commons.*;
e importar los archivos JAR descargados desde: http://commons.apache.org/codec/
Pero el problema sigue existiendo. Eclipse sigue mostrando los errores mencionados anteriormente; por favor avise.
Eclipse le da un error / advertencia porque está tratando de usar clases internas que son específicas de un proveedor de JDK y no son parte de la API pública. Jakarta Commons proporciona su propia implementación de codecs base64, que por supuesto residen en un paquete diferente. Borre esas importaciones y deje que Eclipse importe las clases de Commons adecuadas para usted.
Ejemplo simple con Java 8:
import java.util.Base64;
String str = "your string";
String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
En Android, use los métodos estáticos de la clase de utilidad android.util.Base64 . La documentación a la que se hace referencia dice que la clase Base64 se agregó en el nivel 8 de API (Froyo).
import android.util.Base64;
byte[] encodedBytes = Base64.encode("Test".getBytes());
Log.d("tag", "encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.decode(encodedBytes);
Log.d("tag", "decodedBytes " + new String(decodedBytes));
En Java 7 codifiqué este método.
import javax.xml.bind.DatatypeConverter;
public static String toBase64(String data) {
return DatatypeConverter.printBase64Binary(data.getBytes());
}
En Java 8 se puede hacer como
Base64.getEncoder().encodeToString(string.getBytes(StandardCharsets.UTF_8))
Aquí hay un breve ejemplo completo, autónomo
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Temp {
public static void main(String... args) throws Exception {
final String s = "old crow medicine show";
final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8);
final String encoded = Base64.getEncoder().encodeToString(authBytes);
System.out.println(s + " => " + encoded);
}
}
da salida
old crow medicine show => b2xkIGNyb3cgbWVkaWNpbmUgc2hvdw==
Lo intenté con el siguiente fragmento de código. Funciono bien :-)
com.sun.org.apache.xml.internal.security.utils.Base64.encode("The string to encode goes here");
Necesitas cambiar la importación de tu clase:
import org.apache.commons.codec.binary.Base64;
Y luego cambia tu clase para usar la clase Base64.
Aquí hay un código de ejemplo:
byte[] encodedBytes = Base64.encodeBase64("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));
Luego lee oracle.com/technetwork/java/faq-sun-packages-142232.html .
Actualización (16/12/2016)
Ahora puedes java.util.Base64
con Java8. Primero, importa como lo haces normalmente:
import java.util.Base64;
Luego use los métodos estáticos Base64 de la siguiente manera:
byte[] encodedBytes = Base64.getEncoder().encode("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));
Consulte Javadocs para Base64 para obtener más información: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
Para convertir esto, necesita el codificador y el decodificador que obtendrá de http://www.source-code.biz/base64coder/java/ . Es el archivo Base64Coder.java que necesitará.
Ahora para acceder a esta clase según su requisito, necesitará la siguiente clase:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Base64 {
public static void main(String args[]) throws IOException {
/*
* if (args.length != 2) {System.out.println(
* "Command line parameters: inputFileName outputFileName");
* System.exit(9); } encodeFile(args[0], args[1]);
*/
File sourceImage = new File("back3.png");
File sourceImage64 = new File("back3.txt");
File destImage = new File("back4.png");
encodeFile(sourceImage, sourceImage64);
decodeFile(sourceImage64, destImage);
}
private static void encodeFile(File inputFile, File outputFile) throws IOException {
BufferedInputStream in = null;
BufferedWriter out = null;
try {
in = new BufferedInputStream(new FileInputStream(inputFile));
out = new BufferedWriter(new FileWriter(outputFile));
encodeStream(in, out);
out.flush();
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}
private static void encodeStream(InputStream in, BufferedWriter out) throws IOException {
int lineLength = 72;
byte[] buf = new byte[lineLength / 4 * 3];
while (true) {
int len = in.read(buf);
if (len <= 0)
break;
out.write(Base64Coder.encode(buf, 0, len));
out.newLine();
}
}
static String encodeArray(byte[] in) throws IOException {
StringBuffer out = new StringBuffer();
out.append(Base64Coder.encode(in, 0, in.length));
return out.toString();
}
static byte[] decodeArray(String in) throws IOException {
byte[] buf = Base64Coder.decodeLines(in);
return buf;
}
private static void decodeFile(File inputFile, File outputFile) throws IOException {
BufferedReader in = null;
BufferedOutputStream out = null;
try {
in = new BufferedReader(new FileReader(inputFile));
out = new BufferedOutputStream(new FileOutputStream(outputFile));
decodeStream(in, out);
out.flush();
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}
private static void decodeStream(BufferedReader in, OutputStream out) throws IOException {
while (true) {
String s = in.readLine();
if (s == null)
break;
byte[] buf = Base64Coder.decodeLines(s);
out.write(buf);
}
}
}
En Android, puede convertir su mapa de bits a Base64 para cargarlo en el servidor / servicio web.
Bitmap bmImage = //Data
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageData = baos.toByteArray();
String encodedImage = Base64.encodeArray(imageData);
Esta “imagen codificada” es una representación de texto de su imagen. Puede usar esto para propósitos de carga o para mostrar directamente en la página HTML como se muestra a continuación ( Reference ):
<img alt="" src="data:image/png;base64,<?php echo $encodedImage; ?>" width="100px" />
<img alt="" src="data:image/png;base64,/9j/4AAQ...........1f/9k=" width="100px" />
Documentación: http://dwij.co.in/java-base64-image-encoder
Para java 6-7, la mejor opción es pedir prestado el código del repositorio de Android. No tiene dependencias.
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Base64.java
Si está atascado en una versión de Java anterior a la 8, pero ya está utilizando AWS SDK para Java , puede usar com.amazonaws.util.Base64 .
Si está utilizando Spring Framework al menos la versión 4.1, puede usar la clase org.springframework.util.Base64Utils :
byte[] raw = { 1, 2, 3 };
String encoded = Base64Utils.encodeToString(raw);
byte[] decoded = Base64Utils.decodeFromString(encoded);
Se delegará en Base64 de Java 8, Apache Commons Codec o JAXB DatatypeConverter, dependiendo de lo que esté disponible.
También puedes convertir usando la codificación base64. Para hacer esto puedes usar javax.xml.bind.DatatypeConverter#printBase64Binary
método javax.xml.bind.DatatypeConverter#printBase64Binary
Por ejemplo:
byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
System.out.println(DatatypeConverter.printBase64Binary(salt));
Use la clase nunca más tardía en unirse a la diversión de Java 8: java.util.Base64
apache commons tiene una buena implementación de base64. Usted puede hacer esto tan simple como
// encrypt data on your side using BASE64
byte[] bytesEncoded = Base64.encodeBase64(str .getBytes());
System.out.println("ecncoded value is " + new String(bytesEncoded ));
// Decrypt data on other side, by processing encoded data
byte[] valueDecoded= Base64.decodeBase64(bytesEncoded );
System.out.println("Decoded value is " + new String(valueDecoded));
puede encontrar más detalles sobre la codificación base64 en http://faisalbhagat.blogspot.com/2014/06/base64-encoding-using-java-and.html
Google Guava es una buena opción para codificar y decodificar datos base64:
Config pom:
<dependency>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
<type>jar</type>
<version>14.0.1</version>
</dependency>
Código de muestra:
String inputContent = "Hello Việt Nam";
String base64String = BaseEncoding.base64().encode(inputContent.getBytes("UTF-8"));
//decode
System.out.println("Base64:" + base64String);//SGVsbG8gVmnhu4d0IE5hbQ==
byte[] contentInBytes = BaseEncoding.base64().decode(base64String);
System.out.println("Source content: " + new String(contentInBytes, "UTF-8"));//Hello Việt Nam