Wie konvertiert ein byte-array in einen hex-string in Java?
Ich habe ein byte-array gefüllt mit hex-zahlen und drucken Sie es sich einfach ziemlich sinnlos, denn es gibt viele nicht druckbare Elemente. Was ich brauche, ist die genaue hexcode in form von: 3a5f771c
Warum nicht einfach versuchen Sie es zuerst mit und zeig uns was du drauf hast. Sie haben nichts zu verlieren und alles zu gewinnen. Integer hat eine
möglich, Duplikat der In Java, wie konvertiere ich ein byte-array in einen string von hex-Ziffern, während die führenden Nullen?
"Was ich brauche, ist die genaue hexcode in form von: 3a5f771c..." - Sie bat um eine exakte form, aber Sie nicht bieten ein genaues Beispiel. Los, was Sie zur Verfügung gestellt haben, konvertieren Sie die erste vier bytes in einen string, dann verketten Sie die Ellipsen, die auf die Zeichenfolge.
toHexString(...)
Methode, die helfen kann, falls es das ist was du suchst. Auch String.format(...)
tun können, einige nette Formatierung tricks mit der %2x
code string.möglich, Duplikat der In Java, wie konvertiere ich ein byte-array in einen string von hex-Ziffern, während die führenden Nullen?
"Was ich brauche, ist die genaue hexcode in form von: 3a5f771c..." - Sie bat um eine exakte form, aber Sie nicht bieten ein genaues Beispiel. Los, was Sie zur Verfügung gestellt haben, konvertieren Sie die erste vier bytes in einen string, dann verketten Sie die Ellipsen, die auf die Zeichenfolge.
InformationsquelleAutor Andre | 2012-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Diskussion hier, und vor allem diese Antwort, dies ist die Funktion, die ich derzeit benutze:
Meiner eigenen kleinen Maßstäbe (eine million bytes, ein tausend mal, mit 256 Byte 10 Millionen mal) zeigte es deutlich schneller als jede andere alternative, etwa die Hälfte der Zeit auf long arrays. Im Vergleich zu der Antwort, die ich nahm es, schalten Sie auf bitweise ops - - - - wie bereits in der Diskussion --- Schnitt etwa 20% der Zeit für lange arrays. (Edit: Wenn ich sage, es ist schneller als die alternativen, die ich meine, die alternative code angeboten in die Diskussionen ein. Die Leistung entspricht Commons-Codec, der verwendet sehr ähnlichen code.)
String printHexBinary(byte[])
undbyte[] parseHexBinary(String)
.printHexBinary
ist aber auch viel (2x) langsamer als die Funktion in dieser Antwort. (Ich habe die Quelle; es verwendet einestringBuilder
.parseHexBinary
der ein array verwendet.) Wirklich, obwohl, für die meisten Zwecke ist es schnell genug und Sie wahrscheinlich schon haben.+1 für die Antwort, da Android nicht DataTypeConverter
JDK 7 ist jetzt open source. Wir stellen einen patch zur Verbesserung der Leistung für
printHexBinary
?Für die Rückseite und sehe: stackoverflow.com/a/140861/1284661
javax.xml.bind.DataTypeConverter
entfernt von Java 11.InformationsquelleAutor maybeWeCouldStealAVan
Den Apache-Commons-Codec Bibliothek hat eine Hex Klasse zu tun, diese Art von Arbeit.
Ich bin damit einverstanden, so dass anstelle von
import org.apache.commons.codec.*;
Sie tun konnteimport org.apache.commons.codec.binary.Hex;
Dem muss ich widersprechen. Die einzige schreckliche Sache ist, dass der apache-commons-Bibliotheken nicht standardmäßig enthalten, mit der JRE und JDK. Es gibt einige Bibliotheken, die sind so nützlich, Sie sollten wirklich auf Ihre Klasse Pfad standardmäßig, und dies ist einer von Ihnen.
Ich empfehle diese Antwort ist vertauscht, wie die top-Antwort. Immer abstimmen, verwenden Sie eine gut getestet, performante open-source-Bibliothek über benutzerdefinierten code, der nicht zu verbessern.
Oder im Falle der Verwendung BouncyCastle (org.bouncycastle:bcprov-jdk15on), können Sie diese Klasse verwenden :
org.bouncycastle.util.encoders.Hex
mit dieser Methode :String toHexString(byte[] data)
InformationsquelleAutor chooban
Verwenden
DatatypeConverter.printHexBinary()
. Lesen Sie die Dokumentation in http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/DatatypeConverter.htmlBeispiel:
Folge:
Wie Sie sehen können, erhalten Sie eine hexadezimale Zeichenfolge, die array of bytes mit führenden Nullen.
Diese Antwort ist im Grunde die gleiche wie in der Frage In Java, wie konvertiere ich ein byte-array in einen string von hex-Ziffern, während die führenden Nullen?
vielleicht möchten Sie zu Lesen code.google.com/p/dalvik/wiki/JavaxPackages. Es ist ein Weg, um javax-Klassen in Android. Aber wenn Sie nur wollen, zu konvertieren hex -, es ist nicht der Mühe Wert.
DatatypeConverter ist nicht mehr zugänglich, wie von JDK 9
Es ist immer noch da, aber nicht Teil der Standard-Laufzeit (aufgrund von Java-9-Module).
verlassen Sie sich nicht auf javax.xml.binden, es kompiliert einwandfrei, aber kann nicht gefunden werden zur Laufzeit. wenn Sie dies tun, bereit sein zu behandeln java.lang.NoClassDefFoundError
InformationsquelleAutor PhoneixS
Einfachste Lösung, die keine externen libs, keine Ziffern Konstanten:
Vielleicht langsam. Es ist gut für Dinge, die geschehen gelegentlich, wie login oder ähnliches.
Wenn es langsam ist, so what? In meinem Anwendungsfall ist es nur für eine debug-Anweisung, also vielen Dank für dieses code-fragment.
Die Wiederverwendung einer Bibliothek, indem eine zusätzliche JAR-Dateien von einigen Dutzend kB wäre nicht gerade effizient sein, wenn alles, was Sie brauchen, ist diese Funktion (auf einigen Plattformen, wie Android, die das ganze Glas bekommt, enthalten in der end-Anwendung). Und manchmal kürzer und übersichtlicher code ist besser, wenn die Leistung nicht benötigt wird.
vielleicht, aber in diesem Fall müssen Sie-stream Unterstützung, nicht einen einzigen Anruf-Funktion. dieses ist leicht zu verstehen und zu erinnern, und deshalb zu pflegen.
InformationsquelleAutor Pointer Null
Einen Guave-Lösung, der Vollständigkeit halber:
Nun
hex
ist"48656c6c6f20776f726c64"
.new HashCode(bytes).toString()
.Als der Guave 22.0 es ist
HashCode.fromBytes(checksum).toString()
InformationsquelleAutor Stephan202
Diese simple oneliner funktioniert für mich
String result = new BigInteger(1, inputBytes).toString(16);
BEARBEITEN - Mit dieser wird das entfernen führender Nullen, aber hey, arbeitete für meinen use-case. Danke @Voicu für den Hinweis it out
Und es wird eine führende null zu 50% der Zeit.
InformationsquelleAutor everconfusedGuy
Verwenden DataTypeConverter Klasse
javax.xml.bind.DataTypeConverter
String hexString = DatatypeConverter.printHexBinary(bytes[] raw);
InformationsquelleAutor Coral
Fand ich drei verschiedene Arten hier:
http://www.rgagnon.com/javadetails/java-0596.html
Den elegantesten, als er bemerkt auch, denke ich, ist dieses hier:
if (raw == null) return null
wird nicht scheitern schnell. Warum würden Sie jemals einenull
Schlüssel?Ich nehme an, es ist eine Gewohnheit, um die Eingabe zu validieren. In diesem Fall müssen wir verhindern, dass jede Null-Verweis-Ausnahme, und lassen es die Anrufer zu behandeln, schlechte Daten.
InformationsquelleAutor Michael Bisbjerg
Bei den geringen Kosten für die Lagerung der lookup-Tabelle diese Umsetzung ist einfach und sehr schnell.
BYTE2HEX
array mit einem einfachenfor
Zyklus?Ist das überhaupt möglich mit einem static final (aka Konstante,) Feld?
Es kann zugeordnet werden in einem
static { }
block.InformationsquelleAutor higginse
Ich würde etwas verwenden, wie dies für eine Feste Länge haben, wie hashes:
InformationsquelleAutor Usagi Miyamoto
Wie über dieses?
InformationsquelleAutor Manan Bakshi
Bevorzuge ich diese:
Es ist etwas flexiblere Anpassung der akzeptierten Antwort.
Persönlich, ich halte sowohl die akzeptierte Antwort, und diese überladung zusammen mit ihm, verwendbar in mehr Kontexten.
InformationsquelleAutor Bamaco
Ich in der Regel verwenden Sie die folgende Methode für debuf Aussage, aber ich weiß nicht, ob es ist der beste Weg, es zu tun oder nicht
StringBuilder buf = new StringBuilder(data.length * 2);
.InformationsquelleAutor Snox
Ok, so gibt es eine Reihe von Möglichkeiten, dies zu tun, aber wenn Sie sich entscheiden, eine Bibliothek, die ich würde vorschlagen, Stossen etwa in Ihrem Projekt zu sehen, wenn etwas umgesetzt wurde, in einer Bibliothek, die bereits Teil des Projekts, bevor das hinzufügen einer neuen Bibliothek, die nur zu diesem Zweck. Zum Beispiel, wenn Sie nicht bereits haben
vielleicht haben Sie...
InformationsquelleAutor Aaron Cooley
Einer kleinen Variante der vorgeschlagenen Lösung von @maybewecouldstealavan, die können Sie visuell bundle N bytes zusammen, in der Ausgabe hex-string:
Ist:
InformationsquelleAutor Campa
Finde keine Lösung auf dieser Seite, die nicht
Hier ist eine Lösung, die nicht über die Mängel oben(keine Versprechungen mine nicht andere Mängel, obwohl)
Diese hab ich nicht unter 62 opcodes, aber wenn Sie Leben können, ohne 0-Polsterung in Fall ist das erste byte kleiner als 0x10, dann die folgende Lösung verwendet nur 23 opcodes. Wirklich zeigt, wie "einfach zu implementieren-yourself" - Lösungen wie "pad mit einer null, wenn die string-Länge ist ungerade" kann ziemlich teuer werden, wenn eine native Implementierung ist noch nicht verfügbar(oder in diesem Fall, wenn BigInteger hatte eine option Präfix mit Nullen toString).
InformationsquelleAutor Dmitry
Meine Lösung basiert auf maybeWeCouldStealAVan die Lösung, sondern verlässt sich auf keine zusätzlich zugewiesen lookup-Tabellen. Es nicht verwendet 'int-char' wirft hacks (eigentlich
Character.forDigit()
gilt es, die Durchführung eine Gegenüberstellung zu überprüfen, was die Ziffer der wirklich ist) und somit vielleicht ein bisschen langsamer. Bitte fühlen Sie sich frei, es zu benutzen, wo immer Sie wollen. Cheers.InformationsquelleAutor Netherwire
Wenn Sie mit dem Spring-Security-framework, die Sie verwenden können:
InformationsquelleAutor java-addict301
//Verschiebung bytes ist effizienter
//Können Sie auch dieses
InformationsquelleAutor BluePurse
Wenn Sie auf der Suche für ein byte-array, genau wie diese für python, ich habe konvertiert diese Java-Implementierung in python.
InformationsquelleAutor SkippsDev
InformationsquelleAutor 田咖啡
Hier ist ein
java.util.Base64
-wie die Implementierung(teilweise), ist es nicht ziemlich?InformationsquelleAutor fuweichin
InformationsquelleAutor kakopappa
InformationsquelleAutor Rajneesh Shukla