Процес перетворення масиву байтів у рядок називається декодуванням. Для цього процесу потрібен набір символів. Однак ми повинні використовувати charset для розшифровка масив байтів.
Є два способи перетворити масив байтів на рядок:
- З допомогою Конструктор класу String
- З допомогою Кодування UTF-8
За допомогою String Class Constructor
Найпростіший спосіб перетворити масив байтів у String, ми можемо використовувати конструктор класу String з byte[] як аргумент конструктора.
String str=new String(bytes);
приклад
У наступному прикладі не використовується жодне кодування символів.
hashset java
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(); } } }
Вихід:
За допомогою кодування UTF-8
Пам’ятайте про кодування символів під час перетворення масиву байтів на String. Оскільки байти - це двійкові дані, а рядок - це символьні дані. Важливо знати оригінальне кодування тексту, з якого створено масив байтів. Коли ми використовуємо інше кодування символів, ми не отримуємо оригінальний рядок.
Припустімо, нам потрібно прочитати масив байтів із файлу, який закодовано в ' ISO_8859_1 '. Під час перетворення масиву байтів у рядок у нас немає жодного кодування символів. Ми перетворюємо масив байтів у String за допомогою конструктора класу String, але це не дає гарантії, що ми отримаємо той самий текст назад. Це тому, що конструктор класу String використовує стандартне кодування платформи.
Байти містять 8 бітів, які можуть мати до 256 різних значень. Він працює для набору символів ASCII, де використовується лише сім бітів. Якщо набори символів мають понад 256 значень, ми повинні явно вказати кодування, яке говорить, як кодувати символи в послідовність байтів.
Платформа Java підтримує такі набори символів:
- Стандартні набори символів.ISO_8859_1
- StandardCharsets.US_ASCII
- StandardCharsets.UTF_16
- StandardCharsets.UTF_16BE
- StandardCharsets.UTF_16LE
Якщо ми не пам’ятаємо точне кодування, у таких випадках наша платформа не може належним чином перетворити ці спеціальні символи. Ця проблема вирішується наданням ' UTF-8 ' як кодування символів. Java надає ще один перевантажений конструктор у класі String, який приймає кодування символів.
new String(byte[], 'character encoding');
приклад
У наступному прикладі ми використали StandardCharset.UTF_8 щоб указати кодування.
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(); } } }
Вихід:
приклад
У наступному прикладі ми взяли char під час створення масиву байтів. Працює завдяки автобоксингу. Символ «T» перетворюється на 84 у масиві байтів і так далі. Ось чому вихід обох масивів байтів однаковий.
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); } }
Вихід:
Клас String також має конструктор, у який ми можемо передати байтовий масив і Charset як аргумент. Отже, наступний оператор також можна використовувати для перетворення масиву байтів на рядок у Java.
arp команда
String str = new String(byteArray, StandardCharsets.UTF_8)
Клас String також має конструктор для перетворення підмножини масиву байтів у String.
String(byte[] bytes, int offset, int length, String charsetName)
Давайте подивимося інший приклад, у якому використовується інше кодування.
приклад
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(); } } }
Вихід: