Da signed ad unsigned
Come si fa a convertire un numero da signed ad unsigned?
Il problema è venuto fuori cercando di leggere in Java un file bmp, formato che salva le informazioni dei colori dei pixel in tre byte per pixel, uno per componente RGB. I valori sono ovviamente solo interi positivi su 8 bit, ma leggendoli Java li interpreta come interi con segno a 7 bit, ovvero come numeri codificati in complemento a due su 8 bit.
Come si fa la conversione?
Così:private static int unsignedByteToInt(byte b) {
Il metodo legge un byte, lo mette in AND con il valore esadecimale FF e restituisce il risultato castato a int.
return (int) b & 0xFF;
}
Gli int di Java sono su 4 byte, l'AND lascia inalterati gli otto bit della variabile b e mette a zero i 24 bit in più. In questo modo il bit del segno (quello più significativo) è zero e il numero viene interpretato come positivo.
E vualà, ecco il valore che cerchiamo.
1 commento:
Non ho provato quindi potrei sbagliare, ma in questo caso noi abbiamo usato DataInputStream per leggere byte da file, bisogna verificare se leggendo da BufferedInputStream i byte vengono lo stesso interpretati in complemento a 2 oppure no.
Posta un commento