Frage

Ich habe ein Problem mit der Umwandlung von Roh-Bytes Wert in Java-Typen. Ich Bytes durch einen Datagramm-Socket als ein Byte-Array zu empfangen. Ich weiß genau, welche Bytes bedeutet, was, aber ich weiß nicht, wie sie angemessen zu konvertieren (ich meine, ich weiß Versetzungen, aber nicht wissen, ob das, was ich denke, ich empfangen ist richtig;)).

Zum Beispiel möchte ich 16 bit unsigned short in Java int-Typ konvertieren. Ich einige Beispiele im Web gefunden, das ist:

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

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

Ein weiterer ist die gleiche, aber die letzte Zeile ist:

return (b0 << 8)  + b1;

Natürlich gibt es unterschiedliche Ergebnisse. Welches ist korrekt? Können Sie auch ein gültiges Beispiel geben Sie mir bitte, wie das gleiche zu tun, aber für einen unsigned long?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sie können die Datainputstream oder ByteBuffer verwenden, um die verschiedenen Arten zu lesen. Sie können genau das gleiche für die meisten Operationen unterzeichnet Typen als Werte ohne Vorzeichen verwenden. Ich habe eine einfache Klasse geschrieben zu veranschaulichen, wie Sie die signierten Typen verwenden können, als ob sie unsigned wurden Unsigned

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

Andere Tipps

Ich hatte einige Arbeit ähnlich wie diese ein zu tun, während zurück, und ich fand, dass der beste Weg, um diese Art von Arbeit zu tun ist, um den Einsatz ByteBuffer und ihre Umsätze zu DoubleBuffer, LongBuffer usw. Sie können ein Array von Bytes umwandeln in ein ByteBuffer durch den Aufruf

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

Von dort aus können Sie einen Blick auf die Bytes als eine Liste von ints erhalten durch den Aufruf

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

und Sie können dann die Bytes umwandeln durch den Aufruf

int nextInt = myIntBuffer.get();

Diese Klassen auch eine Menge Unterstützung für Massen get Operationen, also, wenn Sie für eine Tatsache, dass Sie eine ganze Reihe von Daten des gleichen Typs über das Netzwerk ist Empfangen Sie die Conversions sehr schnell tun können.

Ein alternativer Ansatz wäre, wenn überhaupt möglich, eine Art von Java-basierten zu verwenden Serialisierung der Daten über das Netzwerk zu senden. Auf diese Weise können Sie die Conversions viel leichter mit den Stromschreiber Klassen zu tun. Natürlich ist dies nicht möglich sein könnte, vor allem, wenn Sie mit einem Nicht-Java-Server sind in Verbindung stehen, aber es könnte einen Besuch wert sein.

Wirklich spät auf diesem.

Beide sind richtig auf der Grundlage der Endianess der Daten. Siehe hier: http://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top