El procés de conversió d'una matriu de bytes en una cadena s'anomena descodificació. Aquest procés requereix un joc de caràcters. Tanmateix, hauríem d'utilitzar el conjunt de caràcters per descodificació una matriu de bytes.
Hi ha dues maneres de convertir la matriu de bytes a String:
- Mitjançant l'ús de Constructor de classes de cadena
- Mitjançant l'ús de Codificació UTF-8
Mitjançant l'ús del constructor de classes de cadena
La manera més senzilla de convertir una matriu de bytes en String, podem utilitzar el constructor de la classe String amb byte[] com a argument del constructor.
String str=new String(bytes);
Exemple
L'exemple següent no utilitza cap codificació de caràcters.
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(); } } }
Sortida:
Mitjançant la codificació UTF-8
Recordeu la codificació de caràcters mentre convertiu la matriu de bytes a String. Com que bytes són les dades binàries mentre que String són dades de caràcters. És important conèixer la codificació original del text a partir del qual s'ha creat la matriu de bytes. Quan utilitzem una codificació de caràcters diferent, no recuperem la cadena original.
Suposem que hem de llegir la matriu de bytes d'un fitxer que està codificat en ' ISO_8859_1 '. No tenim cap codificació de caràcters mentre convertim la matriu de bytes en cadena. Convertim la matriu de bytes en String mitjançant el constructor de classes String, però no garanteix que recuperarem el mateix text. És perquè el constructor de la classe String utilitza la codificació predeterminada de la plataforma.
Els bytes conté 8 bits que poden tenir fins a 256 valors diferents. Funciona per al conjunt de caràcters ASCII, on només s'utilitzen set bits. Si els conjunts de caràcters tenen més de 256 valors, hauríem d'especificar explícitament la codificació que indica com codificar els caràcters en una seqüència de bytes.
Hi ha els següents conjunts de caràcters compatibles amb la plataforma Java:
- StandardCharsets.ISO_8859_1
- StandardCharsets.US_ASCII
- StandardCharsets.UTF_16
- StandardCharsets.UTF_16BE
- StandardCharsets.UTF_16LE
Quan no recordem la codificació exacta, en aquests casos la nostra plataforma no és capaç de convertir aquests caràcters especials correctament. Aquest problema es resol proporcionant ' UTF-8 ' com a codificació de caràcters. Java proporciona un altre constructor sobrecarregat a la classe String que accepta la codificació de caràcters.
new String(byte[], 'character encoding');
Exemple
En l'exemple següent, hem utilitzat StandardCharset.UTF_8 per especificar la codificació.
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(); } } }
Sortida:
Exemple
A l'exemple següent, hem pres char mentre creem la matriu de bytes. Funciona a causa de l'autoboxing. El caràcter 'T' s'està convertint a 84 a la matriu de bytes i així successivament. És per això que la sortida de les dues matrius de bytes és la mateixa.
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); } }
Sortida:
La classe String també té un constructor en el qual podem passar una matriu de bytes i un conjunt de caràcters com a argument. Així, la següent instrucció també es pot utilitzar per convertir la matriu de bytes a String a Java.
String str = new String(byteArray, StandardCharsets.UTF_8)
La classe String també té un constructor per convertir un subconjunt de la matriu de bytes a String.
String(byte[] bytes, int offset, int length, String charsetName)
Vegem un altre exemple en què s'utilitza una codificació diferent.
Exemple
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(); } } }
Sortida: