Conversão entre String e Array de Bytes

JavaBeginner
Pratique Agora

Introdução

Existem muitas situações em que podemos precisar converter uma string em um array de bytes ou um array de bytes em uma string. Isso pode ser feito através do uso de conjuntos de caracteres (character sets). Neste laboratório, aprenderemos como fazer ambos os tipos de conversões usando vários métodos diferentes.

Usando o método getBytes()

O método getBytes() da classe String fornece uma maneira conveniente de obter um array de bytes. A classe String contém três versões sobrecarregadas para o método getBytes().

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

Usando o método getBytes(String charsetName)

import java.io.UnsupportedEncodingException;

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

Usando o 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 o 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 o Construtor String

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

Usando a Instância 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 o 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();

Executando o código

Copie o código que você deseja executar para um arquivo como ~/project/Conversion.java e execute o seguinte comando no terminal:

javac Conversion.java && java Conversion

Resumo

Em conclusão, existem várias maneiras de converter uma string em um array de bytes ou um array de bytes em uma string. A maneira mais conveniente é usar o método getBytes() da classe String para gerar um array de bytes e, em seguida, usar o construtor da classe String para gerar uma string a partir do array de bytes. Alternativamente, podemos usar Charsets e CharsetEncoders e CharsetDecoders para realizar as conversões.