Domanda

Ho un problema con conversione prime byte valori in tipi java. Ricevo byte da un socket datagramma come una matrice di byte. So esattamente che cosa significa byte, ma non so come convertire in modo appropriato (intendo lo so offset, ma non so se quello che penso che ho ricevuto è corretto;)).

Per esempio, voglio convertire a 16 bit unsigned short in tipo java int. Ho trovato alcuni esempi nel web, quello è:

public int getUShort(byte[] bytes, int offset) {
    int b0 = bytes[offset] & oxFF;
    int b1 = bytes[offset + 1] & oxFF;

    return (b1 << 8) + (b0 << 0);

Un altro è lo stesso, ma l'ultima riga è:

return (b0 << 8)  + b1;

Certo che dà risultati diversi. Quale è corretto? Potete per favore mi dia anche un valido esempio di come fare la stessa cosa ma per un unsigned long?

Grazie in anticipo!

È stato utile?

Soluzione

È possibile utilizzare DataInputStream o ByteBuffer di leggere i vari tipi. È possibile utilizzare i tipi firmati come valori senza segno per la maggior parte delle operazioni lo stesso. Ho scritto una semplice classe per illustrare come è possibile utilizzare i tipi firmati come se fossero senza segno Unsigned

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();

Altri suggerimenti

Ho dovuto fare un certo lavoro simile a questo un po 'indietro e ho trovato che il modo migliore per fare questo tipo di lavoro è quello di utilizzare ByteBuffer e le sue conversioni al DoubleBuffer, LongBuffer, ecc È possibile convertire un array di byte in un ByteBuffer chiamando

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

Da lì, si può ottenere una vista dei byte come un elenco di ints chiamando

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

e si può quindi convertire i byte chiamando

int nextInt = myIntBuffer.get();

Queste classi hanno anche un sacco di supporto per le operazioni get rinfusa, quindi se si sa per certo che si sta ricevendo un sacco di dati dello stesso tipo attraverso la rete è possibile effettuare le conversioni molto velocemente.

Un approccio alternativo potrebbe essere, se possibile, di utilizzare una sorta di serializzazione Java-based per inviare i dati attraverso la rete. Questo ti permette di fare le conversioni molto più facilmente utilizzando le classi flusso scrittore. Naturalmente, questo potrebbe non essere disponibile, soprattutto se si sta comunicando con un server non-Java, ma potrebbe essere la pena di esplorare.

molto tardi su questo.

Entrambi sono corrette in base alla endianess dei dati. Vedi qui: http://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top