PDA

View Full Version : [JAVA] convertire interi in byte e viceversa


noodles83
15-01-2010, 20:13
Devo inviare un array di byte dove i valori numerici single-byte sono rappresentati come interi con segno su 8bit e dove i valori numeri multi-byte sono rappresentati su interi con segno su 16 bit in formato big-endian.

quindi nel caso dei valori single byte (interi compresi tra -127 e +127 ??) posso semplicemente castarli a byte, giusto?

per interi multi-byte come mi devo comportare?

noodles83
16-01-2010, 11:52
up

PGI-Bis
16-01-2010, 12:20
In Java gli interi multi-byte sono sempre big-endian. Per l'intero con segno a 16 bit puoi usare il tipo short.

noodles83
16-01-2010, 12:40
In Java gli interi multi-byte sono sempre big-endian. Per l'intero con segno a 16 bit puoi usare il tipo short.

ho bisogno di manipolare i singoli byte, non voglio utilizzare gli short.

PGI-Bis
16-01-2010, 16:45
Se non ti piacciono gli short usa un int. L'unica cosa che cambia nella rappresentazione di un intero "più piccolo" con un tipo "più grande" è nella propagazione del bit del segno. Se questo è il byte .-128:

1000 000

lo short -128 è

1111 1111 1000 0000

Quando fai la conversione esplicita tronchi i byte in eccesso:

[1111 1111] 1000 0000

e sempre -128 resta.

Forse più che i tipi primitivi ti interessa ByteBuffer?

noodles83
16-01-2010, 18:17
forse mi sono spiegato male io... ti faccio un esempio

ho un array di byte fatto cosi:

array = | 64 | 0 | -16 | 0 | -64 | 0 | 26

sono valori a caso.

Io voglio tradurre in interi i valori da array[1] in poi... sapendo che i valori numerici multi-byte sono espressi come interi con segno su 16 bit in formato big-endian e sapendo che

array[1] = 0
array[2] = -16

sono appunto un singolo valore, precisamente un valore multi-byte e in questo caso di 2 byte in big endian.

PGI-Bis
16-01-2010, 19:10
Il problema... è che non vedo il problema :D.

Provo con ByteBuffer.

byte[] data = { 64, 0, -16, 0, -64, 0, 26 }
ByteBuffer buffer = ByteBuffer.wrap(data); //ordine predefinito BIG_ENDIAN

dato 'sto buffer:

buffer.get() restituisce 1 byte
buffer.getShort() prende due byte e li compone in uno short (cioè un intero multi-byte con segno in ordine BIG_ENDIAN se il buffer è BIG_ENDIAN)

Quindi se dico:

byte v0 = buffer.get();

ottengo 64

se poi dico:

short v1 = buffer.getShort();

ottengo (0 << 8) + (-16 & 0xff)

Lo stesso vale "al contrario":

ByteBuffer buffer = ByteBuffer.allocate(7);
buffer.put((byte) 64);
buffer.putShort(240); //= buffer.put(0).put(-16);