El proceso de convertir una matriz de bytes en una cadena se llama decodificación. Este proceso requiere un Charset. Sin embargo, deberíamos usar charset para descodificación una matriz de bytes.
Hay dos formas de convertir una matriz de bytes en una cadena:
- Mediante el uso Constructor de clase de cadena
- Mediante el uso Codificación UTF-8
Usando el constructor de clases de cadena
La forma más sencilla de convertir una matriz de bytes en String es usar el constructor de la clase String con byte[] como argumento del constructor.
String str=new String(bytes);
Ejemplo
El siguiente ejemplo no utiliza ninguna codificación de caracteres.
public class ByteArraytoStringExample { public static void main(String args[]) { try { byte[] bytes = 'hello world'.getBytes(); //creates a string from the byte array without specifying character encoding String s = new String(bytes); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } } }
Producción:
Usando codificación UTF-8
Recuerde la codificación de caracteres al convertir la matriz de bytes a cadena. Dado que bytes son datos binarios, mientras que String son datos de caracteres. Es importante conocer la codificación original del texto a partir del cual se creó la matriz de bytes. Cuando utilizamos una codificación de caracteres diferente, no recuperamos la cadena original.
Supongamos que tenemos que leer una matriz de bytes de un archivo codificado en ' ISO_8859_1 '. No tenemos ninguna codificación de caracteres al convertir una matriz de bytes en una cadena. Convertimos una matriz de bytes en String usando el constructor de la clase String, pero no ofrece garantía de que recuperaremos el mismo texto. Esto se debe a que el constructor de la clase String utiliza la codificación predeterminada de la plataforma.
Bytes contiene 8 bits que pueden tener hasta 256 valores distintos. Funciona con juegos de caracteres ASCII, donde sólo se utilizan siete bits. Si los juegos de caracteres tienen más de 256 valores, debemos especificar explícitamente la codificación que indica cómo codificar caracteres en una secuencia de bytes.
Los siguientes conjuntos de caracteres compatibles con la plataforma Java son:
- Conjuntos de caracteres estándar.ISO_8859_1
- Conjuntos de caracteres estándar.US_ASCII
- Conjuntos de caracteres estándar.UTF_16
- Conjuntos de caracteres estándar.UTF_16BE
- Conjuntos de caracteres estándar.UTF_16LE
Cuando no recordamos la codificación exacta, nuestra plataforma no puede convertir esos caracteres especiales correctamente. Este problema se resuelve proporcionando ' UTF-8 ' como codificación de caracteres. Java proporciona otro constructor sobrecargado en la clase String que acepta codificación de caracteres.
new String(byte[], 'character encoding');
Ejemplo
En el siguiente ejemplo, hemos utilizado Conjunto de caracteres estándar.UTF_8 para especificar la codificación.
import java.io.IOException; import java.nio.charset.StandardCharsets; public class ByteArraytoStringExample1 { public static void main(String[] args) { try { byte[] b = 'Morning'.getBytes(StandardCharsets.UTF_8); //byte array String string = new String(b, StandardCharsets.UTF_8); //string with 'UTF-8' encoding System.out.println(string); } catch(Exception e) { e.printStackTrace(); } } }
Producción:
Ejemplo
En el siguiente ejemplo, tomamos char al crear la matriz de bytes. Funciona gracias al autoboxing. El carácter 'T' se convierte a 84 en la matriz de bytes y así sucesivamente. Es por eso que la salida de ambas matrices de bytes es la misma.
public class ByteArraytoStringExample2 { public static void main(String[] args) { byte[] byteArray = { 'T', 'E', 'C', 'H', 'N', 'O','L','O','G','Y'}; //byte array of characters byte[] byteArray1 = { 84, 69, 67, 72, 78, 79, 76, 79, 71, 89}; //array of ASCII values String s = new String(byteArray); //converts byteArray to String String str = new String(byteArray1); System.out.println(s); System.out.println(str); } }
Producción:
La clase String también tiene un constructor en el que podemos pasar una matriz de bytes y Charset como argumento. Entonces, la siguiente declaración también se puede usar para convertir una matriz de bytes a una cadena en Java.
String str = new String(byteArray, StandardCharsets.UTF_8)
La clase String también tiene un constructor para convertir un subconjunto de la matriz de bytes en String.
String(byte[] bytes, int offset, int length, String charsetName)
Veamos otro ejemplo en el que se utiliza una codificación diferente.
Ejemplo
import java.io.UnsupportedEncodingException; public class ByteArraytoStringExample3 { public static void main(String args[]) { try { byte[] bytes = new byte[] { 75, 69, 82, 115, 121, 90, 43, 98, -30}; //bytes in ASCII code String utf = new String(bytes, 'UTF-8'); //converts into UTF-8 encoding String cp1252 = new String(bytes, 'Cp1252'); //conversts into Cp1252 endcoding //converts into windows-1252 encoding String windows1252 = new String(bytes, 'Windows-1252'); System.out.println('String in UTF-8 encoding : ' + utf); System.out.println('String in Cp1252 encoding : ' + cp1252); System.out.println('string Windows-1252 encoding : ' + windows1252); } catch(Exception e) { e.printStackTrace(); } } }
Producción: