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
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.
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.
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);
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.