Conversione dei byte e dei caratteri in Java

Se converto un personaggio in byte e poi di nuovo in char , quel personaggio scompare misteriosamente e diventa qualcos’altro. Com’è ansible?

Questo è il codice:

 char a = 'È'; // line 1 byte b = (byte)a; // line 2 char c = (char)b; // line 3 System.out.println((char)c + " " + (int)c); 

Fino alla linea 2 va tutto bene:

Ma cosa c’è che non va nella riga 3? “c” diventa qualcos’altro e il programma viene stampato ? 65480 ? 65480 . È qualcosa di completamente diverso.

Cosa dovrei scrivere nella riga 3 per ottenere il risultato corretto?

Un personaggio in Java è un’unità di codice Unicode che viene considerata come un numero senza segno. Quindi se esegui c = (char)b il valore che ottieni è 2 ^ 16 – 56 o 65536 – 56.

O più precisamente, il byte viene prima convertito in un intero con segno con il valore 0xFFFFFFC8 usando l’ estensione del segno in una conversione allargata. Questo a sua volta viene quindi ridotto a 0xFFC8 quando si 0xFFC8 casting su un char , che si traduce nel numero positivo 65480 .

Dalla specifica del linguaggio:

5.1.4. Ampliamento e restringimento della conversione primitiva

Innanzitutto, il byte viene convertito in un int tramite la conversione primitiva allargata (§5.1.2), quindi l’int risultante viene convertito in un char restringendo la conversione primitiva (§5.1.3).


Per ottenere il punto giusto usa char c = (char) (b & 0xFF) che converte per prima cosa il valore byte di b in intero positivo 200 usando una maschera, azzerando i primi 24 bit dopo la conversione: 0xFFFFFFC8 diventa 0x000000C8 o il numero positivo 200 in decimali.


Sopra è una spiegazione diretta di ciò che accade durante la conversione tra i tipi di byte , int e char primitivi.

Se vuoi codificare / decodificare i caratteri da byte, usa Charset , CharsetEncoder , CharsetDecoder o uno dei metodi di convenienza come new String(byte[] bytes, Charset charset) o String#toBytes(Charset charset) . È ansible ottenere il set di caratteri (come UTF-8 o Windows-1252) da StandardCharsets .