Wie konvertiere ich ein long
in ein byte[]
und zurück in Java?
Ich versuche, a long
in a umzuwandeln , byte[]
damit ich das byte[]
über eine TCP-Verbindung senden kann . Auf der anderen Seite möchte ich das nehmen byte[]
und es wieder in ein konvertieren double
.
java
type-conversion
byte
long-integer
Emre801
quelle
quelle
Antworten:
Oder in eine Klasse eingeschlossen, um zu vermeiden, dass ByteBuffers wiederholt erstellt werden:
Da dies immer beliebter wird, möchte ich nur erwähnen, dass Sie in den allermeisten Fällen besser dran sind, eine Bibliothek wie Guava zu verwenden. Und wenn Sie einen merkwürdigen Widerstand gegen Bibliotheken haben, sollten Sie diese Antwort wahrscheinlich zuerst für native Java-Lösungen in Betracht ziehen . Ich denke, die Hauptsache, die meine Antwort wirklich hat, ist, dass Sie sich nicht selbst um die Endianz des Systems sorgen müssen.
quelle
Sie können die Byte-Konvertierungsmethoden von Google Guava verwenden .
Beispiel:
quelle
Ich habe die ByteBuffer-Methode gegen einfache bitweise Operationen getestet, aber letztere ist deutlich schneller.
quelle
result |= b[i]
der Byte-Wert zuerst in long konvertiert wird, was eine Vorzeichenerweiterung bedeutet. Ein Byte mit dem Wert -128 (hex0x80
) wird zu einem Long mit dem Wert -128 (hex0xFFFF FFFF FFFF FF80
). Zuerst nach der Konvertierung werden die Werte oder: ed zusammen. Die Verwendung von bitwise-and schützt davor, indem zuerst das Byte in ein int konvertiert und die Vorzeichenerweiterung abgeschnitten wird :(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Warum Bytes in Java signiert sind, ist mir ein Rätsel, aber ich denke, dass es zu anderen Typen passt.Wenn Sie nach einer schnellen, nicht abgerollten Version suchen, sollte dies den Trick tun, vorausgesetzt, ein Byte-Array namens "b" mit einer Länge von 8:
Byte [] -> lang
long -> byte [] als genaues Gegenstück zu den oben genannten
quelle
Warum brauchst du das Byte []? warum nicht einfach in die Steckdose schreiben?
Ich nehme an, Sie bedeuten lange nicht lange , letztere Bedarf für Nullwerte zu ermöglichen.
quelle
byte[]
ist nur ein Mittel zu diesem Zweck.ByteBuffer
die laut den Dokumenten "Die anfängliche Reihenfolge eines Byte-Puffers ist immer BIG_ENDIAN.Schreiben Sie einfach den Long in einen DataOutputStream mit einem zugrunde liegenden ByteArrayOutputStream . Aus dem ByteArrayOutputStream können Sie das Byte-Array über toByteArray () abrufen :
Funktioniert entsprechend für andere Grundelemente.
Hinweis: Für TCP benötigen Sie das Byte [] nicht manuell. Sie verwenden einen Socket
socket
und seine Streamsstattdessen.
quelle
Sie können die Implementierung in org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html verwenden
Der Quellcode ist hier:
http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hbase/hbase/0.89.20100924-28/org/apache/hadoop/hbase/util/Bytes.java# Bytes.toBytes% 28long% 29
Suchen Sie nach den Methoden toLong und toBytes.
Ich glaube, mit der Softwarelizenz können Sie Teile des Codes nehmen und verwenden, aber bitte überprüfen Sie dies.
quelle
quelle
Ich werde eine weitere Antwort hinzufügen, die die schnellstmögliche ist yes (ja, sogar mehr als die akzeptierte Antwort), ABER es wird nicht für jeden einzelnen Fall funktionieren. Es wird jedoch für jedes denkbare Szenario funktionieren:
Sie können String einfach als Zwischenstufe verwenden. Beachten Sie, dass Sie damit das richtige Ergebnis erhalten, auch wenn die Verwendung von String möglicherweise zu falschen Ergebnissen führt, solange Sie wissen, dass Sie mit "normalen" Zeichenfolgen arbeiten. Dies ist eine Methode, um die Effektivität zu erhöhen und den Code zu vereinfachen. Im Gegenzug müssen einige Annahmen für die Datenzeichenfolgen verwendet werden, mit denen er arbeitet.
Nachteile der Verwendung dieser Methode: Wenn Sie mit einigen ASCII-Zeichen wie diesen Symbolen am Anfang der ASCII-Tabelle arbeiten, schlagen die folgenden Zeilen möglicherweise fehl, aber seien wir ehrlich - Sie werden sie wahrscheinlich sowieso nie verwenden.
Vorteile der Verwendung dieser Methode: Denken Sie daran, dass die meisten Benutzer normalerweise mit normalen Zeichenfolgen ohne ungewöhnliche Zeichen arbeiten. Dann ist die Methode der einfachste und schnellste Weg.
von Long bis Byte []:
von Byte [] bis Long:
quelle
Wenn Sie bereits ein
OutputStream
zum Schreiben in den Socket verwenden, ist DataOutputStream möglicherweise eine gute Lösung . Hier ist ein Beispiel:Es gibt ähnliche Methoden für
short
,int
,float
usw. Sie können dann mit Datainputstream auf der Empfangsseite.quelle
Mit ByteBuffer.allocate (8) .putLong (obj) .array ():
Quelle:
Für viele andere Verwendungsbeispiele von ByteBuffer:
quelle
Hier ist eine andere Möglichkeit,
byte[]
auflong
Java 8 oder höher zu konvertieren :Das Konvertieren von a
long
kann als Bits hoher und niedriger Ordnung von zwei ganzzahligen Werten ausgedrückt werden, die einem bitweisen ODER unterliegen. Beachten Sie, dass dastoUnsignedLong
aus derInteger
Klasse stammt und der erste AufruftoUnsignedLong
möglicherweise überflüssig ist.Die entgegengesetzte Konvertierung kann ebenfalls abgewickelt werden, wie andere bereits erwähnt haben.
quelle
Kotlin-Erweiterungen für Long- und ByteArray-Typen:
Den vollständigen Code finden Sie in meiner Bibliothek unter https://github.com/ArtemBotnev/low-level-extensions
quelle