Преобразование между строкой и массивом байтов

JavaBeginner
Практиковаться сейчас

Введение

В жизни бывает необходимо преобразовать строку в массив байтов или наоборот. Это можно сделать с использованием наборов символов. В этом практическом занятии мы научимся выполнять оба типа преобразований несколькими разными методами.

Использование метода getBytes()

Метод getBytes() класса String предоставляет удобный способ получить массив байтов. Класс String содержит три перегруженные версии метода getBytes().

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

Использование метода getBytes(String charsetName)

import java.io.UnsupportedEncodingException;

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

Использование метода 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);

Использование метода Charset.encode()

import java.nio.charset.StandardCharsets;

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

Использование 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();

Использование конструктора String

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

Использование экземпляра 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);

Использование метода 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();

Использование 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();

Запуск кода

Скопируйте код, который вы хотите запустить, в файл, например, ~/project/Conversion.java, и выполните следующую команду в терминале:

javac Conversion.java && java Conversion

Резюме

В заключение, существуют несколько способов преобразования строки в массив байтов или массива байтов в строку. Самый удобный способ - использовать метод getBytes() класса String для генерации массива байтов, а затем использовать конструктор класса String для генерации строки из массива байтов. Альтернативно, мы можем использовать Charsets, CharsetEncoders и CharsetDecoders для выполнения преобразований.