Proces konwersji tablicy bajtów na ciąg nazywa się dekodowaniem. Ten proces wymaga zestawu znaków. Chociaż powinniśmy używać zestawu znaków dla rozszyfrowanie tablica bajtów.
Istnieją dwa sposoby konwersji tablicy bajtów na ciąg znaków:
- Używając Konstruktor klasy string
- Używając Kodowanie UTF-8
Za pomocą konstruktora klasy String
Najprostszym sposobem konwersji tablicy bajtów na ciąg znaków jest użycie konstruktora klasy String z bajtem [] jako argumentem konstruktora.
String str=new String(bytes);
Przykład
W poniższym przykładzie nie zastosowano żadnego kodowania znaków.
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(); } } }
Wyjście:
Używając kodowania UTF-8
Zapamiętaj kodowanie znaków podczas konwersji tablicy bajtów na ciąg. Ponieważ bajty to dane binarne, podczas gdy ciąg to dane znakowe. Ważne jest, aby znać oryginalne kodowanie tekstu, z którego utworzono tablicę bajtów. Kiedy użyjemy innego kodowania znaków, nie otrzymamy z powrotem oryginalnego ciągu.
Załóżmy, że musimy odczytać tablicę bajtów z pliku zakodowanego w ' ISO_8859_1 '. Nie mamy żadnego kodowania znaków podczas konwersji tablicy bajtów na ciąg znaków. Tablicę bajtów konwertujemy na String za pomocą konstruktora klasy String, ale nie daje to gwarancji, że otrzymamy z powrotem ten sam tekst. Dzieje się tak dlatego, że konstruktor klasy String używa domyślnego kodowania platformy.
Bajty zawierają 8 bitów, które mogą mieć do 256 różnych wartości. Działa to w przypadku zestawu znaków ASCII, w którym używanych jest tylko siedem bitów. Jeśli zestawy znaków mają więcej niż 256 wartości, powinniśmy jawnie określić kodowanie, które mówi, jak zakodować znaki w sekwencji bajtów.
Platforma Java obsługuje następujące zestawy znaków:
- Standardowe zestawy znaków.ISO_8859_1
- Standardowe zestawy znaków.US_ASCII
- Standardowe zestawy znaków.UTF_16
- Standardowe zestawy znaków.UTF_16BE
- Standardowe zestawy znaków.UTF_16LE
Gdy nie pamiętamy dokładnego kodowania, w takich przypadkach nasza platforma nie jest w stanie poprawnie przekonwertować tych znaków specjalnych. Problem ten rozwiązano, udostępniając opcję „ UTF-8 ' jako kodowanie znaków. Java udostępnia kolejny przeciążony konstruktor w klasie String, który akceptuje kodowanie znaków.
new String(byte[], 'character encoding');
Przykład
W poniższym przykładzie użyliśmy StandardCharset.UTF_8 aby określić kodowanie.
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(); } } }
Wyjście:
Przykład
W poniższym przykładzie pobraliśmy znak podczas tworzenia tablicy bajtów. Działa dzięki autoboxingowi. Znak „T” jest konwertowany na 84 w tablicy bajtów i tak dalej. Dlatego wynik obu tablic bajtów jest taki sam.
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); } }
Wyjście:
Klasa String posiada również konstruktor, w którym możemy przekazać tablicę bajtów i zestaw znaków jako argument. Zatem poniższej instrukcji można również użyć do konwersji tablicy bajtów na ciąg znaków w Javie.
String str = new String(byteArray, StandardCharsets.UTF_8)
Klasa String posiada również konstruktor umożliwiający konwersję podzbioru tablicy bajtów na String.
wiem
String(byte[] bytes, int offset, int length, String charsetName)
Zobaczmy inny przykład, w którym zastosowano inne kodowanie.
Przykład
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(); } } }
Wyjście: