Conversión entre Cadena y Arreglo de Bytes

JavaBeginner
Practicar Ahora

Introducción

Hay muchos casos en los que es posible que necesitemos convertir una cadena de texto en una matriz de bytes o una matriz de bytes en una cadena de texto. Esto se puede hacer mediante el uso de conjuntos de caracteres. En este laboratorio, aprenderemos a realizar ambos tipos de conversiones utilizando varios métodos diferentes.

Usando el método getBytes()

El método getBytes() de la clase String proporciona una forma conveniente de obtener una matriz de bytes. La clase String contiene tres versiones sobrecargadas del método getBytes().

String s = "demo!";
byte[] byteArr = s.getBytes();

Usando el método getBytes(String charsetName)

import java.io.UnsupportedEncodingException;

String s = "demo!";
String namedCharset = "UTF-16";
byte[] byteArr = s.getBytes(namedCharset);

Usando el método getBytes(Charset charset)

import java.nio.charset.Charset;
import java.util.Arrays;

String s = "demo!";
Charset charset = Charset.forName("UTF-16");
byte[] byteArr = s.getBytes(charset);

Usando el método Charset.encode()

import java.nio.charset.StandardCharsets;

String s = "demo????????????";
Charset charset = StandardCharsets.ISO_8859_1;
byte[] byteArr = charset.encode(s).array();

Usando CharsetEncoder

import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;

String s = "demo????????????";
CharsetEncoder charsetEncoder = StandardCharsets.ISO_8859_1.newEncoder();
charsetEncoder.onMalformedInput(CodingErrorAction.IGNORE);
charsetEncoder.onUnmappableCharacter(CodingErrorAction.REPLACE)
            .replaceWith(new byte[] {-121});
byte[] byteArr = charsetEncoder.encode(CharBuffer.wrap(s)).array();

Usando el Constructor de String

byte[] byteArr = {-2, -1, 0, 100, 0, 101, 0, 109, 0, 111, 0, 33};
String stringFromBytes = new String(byteArr, "UTF-16");

Usando una Instancia de Charset

Charset charset = Charset.forName("UTF-16");
byte[] byteArr = {-2, -1, 0, 100, 0, 101, 0, 109, 0, 111, 0, 33};
String stringFromBytes = new String(byteArr, charset);

Usando el método Charset.decode()

import java.nio.ByteBuffer;

Charset charset = StandardCharsets.UTF_16;
byte[] byteArr = {-2, -1, 0, 100, 0, 101, 0, 109, 0, 111, 0, 33, -10};
String stringFromBytes = charset.decode(ByteBuffer.wrap(byteArr)).toString();

Usando CharsetDecoder

import java.nio.charset.CharacterCodingException;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;

CharsetDecoder charsetDecoder = StandardCharsets.UTF_16.newDecoder();
charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPLACE)
            .onMalformedInput(CodingErrorAction.REPLACE)
            .replaceWith("*");
byte[] byteArr = {-2, -1, 0, 100, 0, 101, 0, 109, 0, 111, 0, 33, -10};
String stringFromBytes = charsetDecoder.decode(ByteBuffer.wrap(byteArr)).toString();

Ejecutando el código

Copia el código que quieres ejecutar en un archivo como ~/project/Conversion.java y ejecuta el siguiente comando en la terminal:

javac Conversion.java && java Conversion

Resumen

En resumen, hay múltiples maneras de convertir una cadena en un arreglo de bytes o un arreglo de bytes en una cadena. La manera más conveniente es utilizar el método getBytes() de la clase String para generar un arreglo de bytes y luego utilizar el constructor de la clase String para generar una cadena a partir del arreglo de bytes. Alternativamente, podemos utilizar Charsets y CharsetEncoders y CharsetDecoders para realizar las conversiones.