Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    Conversione da int a byte[]

    Salve. Come posso fare per convertire un int a byte??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Conversione da int a byte[]

    Originariamente inviato da tcc
    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.

    int val = .....

    byte b3 = (byte) (val >> 24);
    ....
    ....
    byte b0 = (byte) val;
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Hmmm

    Codice PHP:
    byte b3 = (byte) (val >> 24); 
    Sarebbe? Non basta fare:

    Codice PHP:
    int val 1000;
    byte val2 = (byte)val
    ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    Codice PHP:
    byte b3 = (byte) (val >> 24); 
    Sarebbe?
    Ottiene il byte più "significativo" del int.
    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!!

    Originariamente inviato da PerformancePort
    Non basta fare:

    Codice PHP:
    int val 1000;
    byte val2 = (byte)val
    ?
    Questo è un "banale" cast (down-cast), che tra l'altro tronca solo il valore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ah !!! ehehe non avevo capito ...

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Come devo proseguire per fare il viceversa da byte a int???

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Come devo proseguire per fare il viceversa da byte a int???
    int val = (b3 << 24) | ((b2 & 0xFF) << 16) | .......
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho risolto in questo modo:

    codice:
    public int byteArrayToInt(byte [] buffer)
    {
        return buffer[0]+(buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);
    }
    Che diifferenza c'è con il tua soluzione??

  9. #9
    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;

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    codice:
        return buffer[0]+(buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);
    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.

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.