Ich suche nach einer Möglichkeit, eine lange Zeichenfolge (aus einem Speicherauszug), die Hex-Werte darstellt, in ein Byte-Array umzuwandeln.
Ich hätte es nicht besser formulieren können als die Person, die hier dieselbe Frage gestellt hat .
Aber um es original zu halten, werde ich es auf meine eigene Weise formulieren: Angenommen, ich habe eine Zeichenfolge "00A0BF"
, die ich gerne als die interpretieren würde
byte[] {0x00,0xA0,0xBf}
was sollte ich tun?
Ich bin ein Java-Neuling und habe am Ende BigInteger
führende Hex-Nullen verwendet und darauf geachtet. Aber ich finde es hässlich und ich bin mir sicher, dass mir etwas Einfaches fehlt.
BigInteger
hier gezähmt .String.getBytes()
nicht so, wie Sie es sich vorstellen . Musste das auf die harte Tour lernen.if ("FF".getBytes() != "ff".getBytes()) { System.out.println("Try again"); }
Antworten:
Hier ist eine Lösung, die meiner Meinung nach besser ist als jede bisher veröffentlichte:
Gründe, warum es eine Verbesserung ist:
Sicher mit führenden Nullen (im Gegensatz zu BigInteger) und mit negativen Bytewerten (im Gegensatz zu Byte.parseByte)
Konvertiert den String nicht in ein
char[]
oder erstellt StringBuilder- und String-Objekte für jedes einzelne Byte.Keine Bibliotheksabhängigkeiten, die möglicherweise nicht verfügbar sind
Sie können die Argumentprüfung über
assert
oder Ausnahmen hinzufügen, wenn nicht bekannt ist, dass das Argument sicher ist.quelle
Einzeiler:
Warnungen :
eckes
).Fabian
dafür), aber Sie können einfach den Quellcode verwenden, wenn Ihr Systemjavax.xml
aus irgendeinem Grund fehlt . Vielen Dank an @Bert Regelink
für das Extrahieren der Quelle.quelle
java.se
ClassNotFoundException
--add-modules java.se.ee
javax.xml.bind.DatatypeConverter
bereits eine Methode zum Codieren / Decodieren von Base64-Daten. SieheparseBase64Binary()
undprintBase64Binary()
.DataTypeConverter
, 11 Java SE hat die JAXB API vollständig entfernt und ist jetzt nur mit Java EE enthalten. Sie können es auch als Maven-Abhängigkeit hinzufügen, wie hier vorgeschlagen: stackoverflow.com/a/43574427/7347751Die Hex-Klasse im Commons-Codec sollte das für Sie tun.
http://commons.apache.org/codec/
quelle
Sie können jetzt BaseEncoding in verwenden
guava
, um dies zu erreichen.Um es umzukehren, verwenden Sie
quelle
Eigentlich finde ich die BigInteger-Lösung sehr schön:
Bearbeiten: Nicht sicher für führende Nullen , wie auf dem Poster angegeben.
quelle
Für diejenigen unter Ihnen, die sich für den eigentlichen Code hinter den Einzeilern von FractalizeR interessieren (ich brauchte das, da javax.xml.bind für Android nicht verfügbar ist (standardmäßig)), kommt dieser von com.sun.xml.internal.bind. DatatypeConverterImpl.java :
quelle
Das
HexBinaryAdapter
bietet die Möglichkeit, zwischenString
und zu marshallen und zu marshallenbyte[]
.Das ist nur ein Beispiel, das ich eingegeben habe ... Ich verwende es einfach so wie es ist und muss keine separate Methode für die Verwendung erstellen.
quelle
Hier ist eine Methode, die tatsächlich funktioniert (basierend auf mehreren vorherigen halbkorrekten Antworten):
Das einzig mögliche Problem, das ich sehen kann, ist, ob die Eingabezeichenfolge extrem lang ist. Durch Aufrufen von toCharArray () wird eine Kopie des internen Arrays der Zeichenfolge erstellt.
EDIT: Oh, und übrigens, Bytes sind in Java signiert, also wird Ihre Eingabezeichenfolge in [0, -96, -65] anstelle von [0, 160, 191] konvertiert. Aber das wusstest du wahrscheinlich schon.
quelle
In Android, wenn Sie mit Hex arbeiten, können Sie okio versuchen .
einfache Verwendung:
und Ergebnis wird sein
quelle
Die
BigInteger()
Methode von java.math ist sehr langsam und nicht empfehlenswert.Integer.parseInt(HEXString, 16)
kann bei einigen Zeichen Probleme verursachen, ohne in Digit / Integer zu konvertieren
eine gut funktionierende Methode:
Funktion:
Viel Spaß, viel Glück
quelle
BEARBEITEN: Wie von @mmyers hervorgehoben, funktioniert diese Methode nicht bei Eingaben, die Teilzeichenfolgen enthalten, die Bytes mit gesetztem High-Bit ("80" - "FF") entsprechen. Die Erklärung finden Sie unter Fehler-ID: 6259307 Byte.parseByte funktioniert nicht wie in der SDK-Dokumentation angegeben .
quelle
Für das, was es wert ist, ist hier eine andere Version, die Zeichenfolgen mit ungerader Länge unterstützt, ohne auf die Verkettung von Zeichenfolgen zurückzugreifen.
quelle
Ich habe immer eine Methode wie verwendet
Diese Methode teilt auf durch Leerzeichen getrennte Hex-Werte auf, aber es wäre nicht schwierig, die Zeichenfolge nach anderen Kriterien aufzuteilen, z. B. in Gruppierungen von zwei Zeichen.
quelle
Byte
/byte
Fall: höchstes Bit ohne Führung gesetzt -)Ich mag die Character.digit-Lösung, aber hier ist, wie ich sie gelöst habe
quelle
Der von Bert Regelink vorgelegte Kodex funktioniert einfach nicht. Versuche Folgendes:
quelle
Ich fand, dass Kernel Panic die für mich nützlichste Lösung hat, stieß jedoch auf Probleme, wenn die Hex-Zeichenfolge eine ungerade Zahl war. löste es so:
Ich füge einem Array eine Anzahl von Hex-Zahlen hinzu, also übergebe ich den Verweis auf das Array, das ich verwende, und das Int, das ich konvertieren muss, und gebe die relative Position der nächsten Hex-Nummer zurück. Das letzte Byte-Array hat also [0] Anzahl von Hex-Paaren, [1 ...] Hex-Paare, dann die Anzahl von Paaren ...
quelle
Basierend auf der op-Voted-Lösung sollte Folgendes etwas effizienter sein:
Denn: Die anfängliche Konvertierung in ein char-Array erspart die Längenprüfungen in charAt
quelle
Wenn Sie Java 8-Streams als Codierungsstil bevorzugen, können Sie dies nur mit JDK-Grundelementen erreichen.
Die
, 0, s2.size()
Parameter in der Collector-Verkettungsfunktion können weggelassen werden, wenn Sie nichts dagegen haben, zu fangenIOException
.quelle
quelle
Meine formale Lösung:
Ist wie die PHP hex2bin () Funktion, aber im Java-Stil.
Beispiel:
quelle
Spät zur Party, aber ich habe die obige Antwort von DaveL zu einer Klasse mit umgekehrter Aktion zusammengefasst - nur für den Fall, dass es hilft.
Und JUnit-Testklasse:
quelle
Ich weiß, dass dies ein sehr alter Thread ist, aber ich möchte immer noch meinen Penny hinzufügen.
Wenn ich wirklich eine einfache Hex-Zeichenfolge in einen Binärkonverter codieren muss, möchte ich dies wie folgt tun.
quelle
Bei weitem nicht die sauberste Lösung. Aber es funktioniert bei mir und ist gut formatiert:
Die Ausgabe:
quelle
Ich denke, ich werde es für dich tun. Ich habe es aus einer ähnlichen Funktion zusammengeschustert, die die Daten als Zeichenfolge zurückgegeben hat:
quelle
Für mich war dies die Lösung, HEX = "FF01", dann aufgeteilt in FF (255) und 01 (01)
quelle