|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
[JAVA] convertire interi in byte e viceversa
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?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 Ultima modifica di noodles83 : 15-01-2010 alle 20:20. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
up
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
In Java gli interi multi-byte sono sempre big-endian. Per l'intero con segno a 16 bit puoi usare il tipo short.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
ho bisogno di manipolare i singoli byte, non voglio utilizzare gli short.
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
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.
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il problema... è che non vedo il problema
![]() 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);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:34.