Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    143

    [Java] da byte a short e viceversa

    Ciao. Nel mio progetto avevo bisogno di metodi che mi convertissero un numero di tipo short in un array di 2 byte e viceversa. Pensavo che lo shift e il cast esplicito fossero sufficienti ma leggendo qua e la sulla rete ho trovato che questi due metodi vanno realizzati in questo modo:

    codice:
    //da short senza segno in array di 2 byte
    private byte[] toByte (short dati) 
    {
    	return new byte[]{(byte)(data & 0xff),(byte)((data >>> 8) & 0xffff)};
    }
    
    
    //da array di 2 byte a short senza segno
    private int toShort (byte[] data)
    {		
    	short tmp= (short)(0xff & data[0] | 0xffff & data[1] << 8 ) ;
    	return  tmp;
    }
    Non capisco perché sia necessario effettuare il confronto bit a bit per realizzare questi due metodi. Se qualcuno mi può dare quanche dritta a riguardo gliene sarei grato.


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

    Re: [Java] da byte a short e viceversa

    Originariamente inviato da namek
    Non capisco perché sia necessario effettuare il confronto bit a bit per realizzare questi due metodi. Se qualcuno mi può dare quanche dritta a riguardo gliene sarei grato.

    Non c'è alcun "confronto" bit a bit!!! Semmai delle "mascherature" con AND.

    Comunque da short a byte[], è molto più semplice di quello postato!!

    return new byte[] { (byte) data, (byte) (data >> 8) };

    No?
    Qui non servono AND .... il cast a byte già "tronca" la parte alta. Nella seconda parte, usare >> o >>> (shift a destra signed o unsigned) non è importante ... tanto il cast tronca poi comunque a 8 bit.


    Da byte[] a short:

    return (short) (data[0] & 0xFF | (data[1] & 0xFF) << 8);

    Qui la AND ci vuole, altrimenti farebbe l'estensione di segno!! La AND con 0xFF fa sì che il valore venga prima portato a int (con estensione di segno) ma la AND fa passare solo gli 8 bit bassi.

    Sulla seconda parte si hanno 2 opzioni:

    a) (data[1] & 0xFF) << 8

    oppure

    b) data[1] << 8 & 0xFF00

    Con entrambe si ha un valore del tipo 0x0000nn00. Io preferisco la prima opzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Anzi ... prima mi stavo dimenticando che c'è il cast finale a short. Quindi per la conversione da byte[] a short si può ancora ulteriormente semplificare!!!

    return (short) (data[0] & 0xFF | data[1] << 8);

    Et voilà, solo 1 AND.
    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.