Konvertieren von RAW-Byte-Werte in Java-Typen
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!
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 int
s 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