Salve. Come posso fare per convertire un int a byte??
Salve. Come posso fare per convertire un int a byte??
Se intendi spezzare un int nei suoi 4 byte, basta fare dei shift/cast in modo opportuno.Originariamente inviato da tcc
Salve. Come posso fare per convertire un int a byte??
int val = .....
byte b3 = (byte) (val >> 24);
....
....
byte b0 = (byte) val;
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Hmmm
Sarebbe? Non basta fare:Codice PHP:byte b3 = (byte) (val >> 24);
?Codice PHP:int val = 1000;
byte val2 = (byte)val;
Ottiene il byte più "significativo" del int.Originariamente inviato da PerformancePort
Sarebbe?Codice PHP:byte b3 = (byte) (val >> 24);
Il titolo indicava "Conversione da int a byte[]" quindi ho pensato appunto allo spezzamento del int nei suoi 4 byte.
Se si trattava di fare una semplice conversione da int a byte (come hai detto sotto) .... mi parrebbe ovvio (insomma ... lo davo per scontato) .... si fa il cast!!
Questo è un "banale" cast (down-cast), che tra l'altro tronca solo il valore.Originariamente inviato da PerformancePort
Non basta fare:
?Codice PHP:int val = 1000;
byte val2 = (byte)val;
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Come devo proseguire per fare il viceversa da byte a int???
int val = (b3 << 24) | ((b2 & 0xFF) << 16) | .......Originariamente inviato da tcc
Come devo proseguire per fare il viceversa da byte a int???
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho risolto in questo modo:
Che diifferenza c'è con il tua soluzione??codice:public int byteArrayToInt(byte [] buffer) { return buffer[0]+(buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24); }
Scusa ma facendo in questo modo non si ha una perdita di dati quando avviene la conversione da int a byte?
int val = 1000;
byte val2 = (byte)val;
Sbagliato. A parte che si usa tipicamente un OR ( | ), anche se matematicamente (ammesso di spostare i byte nel modo giusto) il risultato sarebbe lo stesso.Originariamente inviato da tcc
codice:return buffer[0]+(buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);
Ma la cosa davvero sbagliata è che non hai considerato il sign-extension dovuto alla "unary numeric promotion" a int.
Se buffer[2] contiene es. 0xA5 (bit 7 a 1 !) la expressione buffer[2] << 16 fa sì che l'operando venga convertito a int. Ma da byte a int si ha l'estensione di segno, quindi 0xA5 diventa 0xFFFFFFA5 che anche spostato di 16 diventa 0xFFA50000. Quel 0xFF alto va a "sporcare" il risultato finale!!!
((buffer[2] & 0xFF) << 16)
Con il AND con 0xFF il valore viene comunque portato a int con estensione di segno ma con la AND diventa subito dopo un int 0x000000A5 che ora spostato di 16 a sinistra non "sporca" più gli altri bit perché è 0x00A50000.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet