+1 auf die reinste Probe von 3vilness, die ich je gesehen habe: Verwenden einer BigInteger zum Konvertieren von einem Byte [] ...
Eduardo Costa
13
Liebe es! Keine Loops und kein Bit-Flipping. Ich möchte Ihnen 0xFF Upvotes geben :)
Laher
5
Um 40 Zeichen zu gewährleisten, sollten Sie keine Auffüllung hinzufügen: return String.format ("% 040x", neue BigInteger (arg.getBytes (/ * YOUR_CHARSET? * /)));
Ron
4
@Kaleb Hast du eine Idee, wenn möglich, den resultierenden String zurück zu konvertieren? Wenn ja, können Sie mir einige Hinweise geben? Vielen Dank!
Artaxerxe
1
Sie müssen den BigInteger(int,byte[])Konstruktor verwenden. Andernfalls erhalten Sie eine negative BigInteger, wenn das erste Byte negativ ist.
Joni
62
Um sicherzustellen, dass das Hex immer 40 Zeichen lang ist, muss die BigInteger positiv sein:
Diese Methode ist eigentlich die richtige. Der Try- byte[] data = { -1, 1 };Code in dieser Antwort funktioniert einwandfrei, während der mit 17 Upvotes fehlschlägt.
Hudolejev
1
Ist es möglich, ein Byte mit Wert -1aus einer Zeichenfolge abzurufen (wie im Beispiel angefordert)?
Kaleb Pederson
@KalebPederson Ja. Es ist nicht einmal sehr schwer. . Wenn Ihre gewählte Codierung jemals das höchstwertige Bit eines Zeichens verwendet (z. B. UTF- * do), haben Sie negative bytes in Ihrem Array.
Interessant, wenn Sie das Rad nicht neu erfinden wollen.
Federico Zancan
3
@ MelNicholson Es gibt eine decodeHex-Funktion in Hex, um zu einem Byte [] zu gelangen. Sie müssen dies verwenden, da nichts garantiert, dass eine zufällige HEX-Zeichenfolge in eine Zeichenfolge in Ihrer Codierung konvertiert werden kann.
BxlSofty
18
Die Zahlen, die Sie hexadezimal codieren, müssen eine Codierung der Zeichen darstellen, z. B. UTF-8. Konvertieren Sie also zuerst den String in ein Byte [], das den String in dieser Codierung darstellt, und konvertieren Sie dann jedes Byte in hexadezimal.
publicstaticString hexadecimal(String input,String charsetName)throwsUnsupportedEncodingException{if(input ==null)thrownewNullPointerException();return asHex(input.getBytes(charsetName));}privatestaticfinalchar[] HEX_CHARS ="0123456789abcdef".toCharArray();publicstaticString asHex(byte[] buf){char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}
Dies ist eine interessante Lösung, die den Kern der digitalen Darstellung von Daten berührt. Könnten Sie bitte erklären, was Sie tun und was die "magischen Zahlen" in Ihrer Lösung darstellen? Ein Neuling weiß möglicherweise nicht, was der Operator >>> bedeutet, warum wir das bitweise-und & zusammen mit einer Maske von 0xF0 verwenden oder warum das Zeichen-Array die Größe [2 * buf.length] hat.
Hinweis : Dies verursacht zusätzliche Probleme mit Java 9und neueren Versionen, da die API standardmäßig nicht enthalten ist. Als Referenz siehe zB dieseGitHub Ausgabe.
Schön, aber ich würde format("%02x")so verwenden, dass format () immer 2 Zeichen verwendet. Obwohl ASCII zweistellig hexadezimal ist, dh A = 0x65
Mike Jones
8
Alle Antworten, die auf String.getBytes () basieren, beinhalten die Codierung Ihres Strings gemäß einem Zeichensatz. Sie erhalten nicht unbedingt den Hex-Wert der 2-Byte- Zeichen , aus denen Ihre Zeichenfolge besteht. Wenn das, was Sie tatsächlich wollen, einem Hex-Viewer entspricht, müssen Sie direkt auf die Zeichen zugreifen. Hier ist die Funktion, die ich in meinem Code zum Debuggen von Unicode-Problemen verwende:
Dies ist in Ordnung, wenn Sie die interne Darstellung der Java-Zeichen sehen möchten, nämlich UTF-16, eine spezifische Darstellung von Unicode.
Jonathan Rosenne
5
byte[] bytes = string.getBytes(CHARSET);// you didn't say what charset you wantedBigInteger bigInt =newBigInteger(bytes);String hexString = bigInt.toString(16);// 16 is the radix
Sie können hexStringan dieser Stelle mit der Einschränkung zurückkehren, dass führende Nullzeichen entfernt werden und das Ergebnis eine ungerade Länge hat, wenn das erste Byte kleiner als 16 ist. Wenn Sie diese Fälle behandeln müssen, können Sie zusätzlichen Code hinzufügen mit 0s auffüllen:
Vielen Dank für die Korrektur, Software Monkey. Ich war ziemlich müde, als ich die Antwort schrieb, und mein Test für 'raw [i] <= 9' ist eindeutig unzureichend.
Rodion
1
Das funktioniert wirklich gut. Gibt es eine Möglichkeit, das generierte Hex wieder in einen String umzukehren?
1
Wo ist str darin?
Viswanath Lekshmanan
3
Konvertieren Sie es zuerst mit der Funktion getBytes () in Bytes und konvertieren Sie es dann in hexadezimales Zeichen.
Dies ist keine Lösung. Die Frage lautet, wie die hexadezimale Darstellung des Inhalts eines beliebigen Strings abgerufen werden kann , und es wird speziell "testing123" als Beispiel angegeben.
Skomisa
1
Verwenden mehrerer Völker Hilfe von mehreren Threads.
Ich weiß, dass dies beantwortet wurde, aber ich möchte eine vollständige Codierungs- und Decodierungsmethode für alle anderen in meiner gleichen Situation angeben.
Hier sind meine Kodierungs- und Dekodierungsmethoden.
// Global Charset EncodingpublicstaticCharset encodingType =StandardCharsets.UTF_8;// Text To HexpublicstaticString textToHex(String text){byte[] buf =null;
buf = text.getBytes(encodingType);char[] HEX_CHARS ="0123456789abcdef".toCharArray();char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}// Hex To TextpublicstaticString hexToText(String hex){int l = hex.length();byte[] data =newbyte[l /2];for(int i =0; i < l; i +=2){
data[i /2]=(byte)((Character.digit(hex.charAt(i),16)<<4)+Character.digit(hex.charAt(i +1),16));}String st =newString(data, encodingType);return st;}
Hier sind einige Benchmarks , die verschiedene Ansätze und Bibliotheken vergleichen. Guave schlägt Apache Commons Codec beim Dekodieren. Commons Codec schlägt Guava bei der Codierung. Und JHex schlägt sie beide beim Dekodieren und Kodieren.
Alles ist in einer einzigen Klassendatei für JHex . Sie können das Einfügen kopieren, wenn Sie keine weitere Bibliothek in Ihrem Abhängigkeitsbaum haben möchten. Beachten Sie auch, dass es nur als Java 9-JAR verfügbar ist, bis ich herausgefunden habe, wie mehrere Release-Ziele mit Gradle und dem Bintray-Plugin veröffentlicht werden können.
Eine kurze und bequeme Möglichkeit, einen String in seine hexadezimale Notation umzuwandeln, ist:
publicstaticvoid main(String... args){String str ="Hello! This is test string.";char ch[]= str.toCharArray();StringBuilder sb =newStringBuilder();for(int i =0; i < ch.length; i++){
sb.append(Integer.toHexString((int) ch[i]));}System.out.println(sb.toString());}
Antworten:
Hier ist eine kurze Möglichkeit, es in Hex umzuwandeln:
quelle
BigInteger(int,byte[])
Konstruktor verwenden. Andernfalls erhalten Sie eine negative BigInteger, wenn das erste Byte negativ ist.Um sicherzustellen, dass das Hex immer 40 Zeichen lang ist, muss die BigInteger positiv sein:
quelle
byte[] data = { -1, 1 };
Code in dieser Antwort funktioniert einwandfrei, während der mit 17 Upvotes fehlschlägt.-1
aus einer Zeichenfolge abzurufen (wie im Beispiel angefordert)?byte
s in Ihrem Array.http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
quelle
Die Zahlen, die Sie hexadezimal codieren, müssen eine Codierung der Zeichen darstellen, z. B. UTF-8. Konvertieren Sie also zuerst den String in ein Byte [], das den String in dieser Codierung darstellt, und konvertieren Sie dann jedes Byte in hexadezimal.
quelle
Verwendung
DatatypeConverter.printHexBinary()
:Anwendungsbeispiel:
Drucke:
Hinweis : Dies verursacht zusätzliche Probleme mit
Java 9
und neueren Versionen, da die API standardmäßig nicht enthalten ist. Als Referenz siehe zB dieseGitHub
Ausgabe.quelle
Hier eine andere Lösung
quelle
format("%02x")
so verwenden, dass format () immer 2 Zeichen verwendet. Obwohl ASCII zweistellig hexadezimal ist, dh A = 0x65Alle Antworten, die auf String.getBytes () basieren, beinhalten die Codierung Ihres Strings gemäß einem Zeichensatz. Sie erhalten nicht unbedingt den Hex-Wert der 2-Byte- Zeichen , aus denen Ihre Zeichenfolge besteht. Wenn das, was Sie tatsächlich wollen, einem Hex-Viewer entspricht, müssen Sie direkt auf die Zeichen zugreifen. Hier ist die Funktion, die ich in meinem Code zum Debuggen von Unicode-Problemen verwende:
Dann gibt Ihnen stringToHex ("testing123"):
quelle
Sie können
hexString
an dieser Stelle mit der Einschränkung zurückkehren, dass führende Nullzeichen entfernt werden und das Ergebnis eine ungerade Länge hat, wenn das erste Byte kleiner als 16 ist. Wenn Sie diese Fälle behandeln müssen, können Sie zusätzlichen Code hinzufügen mit 0s auffüllen:quelle
Um den Integer-Wert von hex zu erhalten
quelle
Konvertieren Sie einen Buchstaben in Hex-Code und Hex-Code in Buchstaben.
quelle
Ich würde so etwas vorschlagen, wo
str
ist Ihre Eingabezeichenfolge:quelle
Konvertieren Sie es zuerst mit der Funktion getBytes () in Bytes und konvertieren Sie es dann in hexadezimales Zeichen.
quelle
Um den anderen Weg zu gehen (hex zu string), können Sie verwenden
quelle
quelle
quelle
String in Hexadezimal konvertieren :
Auf jeden Fall ist dies der einfache Weg.
quelle
Verwenden mehrerer Völker Hilfe von mehreren Threads.
Ich weiß, dass dies beantwortet wurde, aber ich möchte eine vollständige Codierungs- und Decodierungsmethode für alle anderen in meiner gleichen Situation angeben.
Hier sind meine Kodierungs- und Dekodierungsmethoden.
quelle
Viel besser:
quelle
Hier sind einige Benchmarks , die verschiedene Ansätze und Bibliotheken vergleichen. Guave schlägt Apache Commons Codec beim Dekodieren. Commons Codec schlägt Guava bei der Codierung. Und JHex schlägt sie beide beim Dekodieren und Kodieren.
JHex Beispiel
Alles ist in einer einzigen Klassendatei für JHex . Sie können das Einfügen kopieren, wenn Sie keine weitere Bibliothek in Ihrem Abhängigkeitsbaum haben möchten. Beachten Sie auch, dass es nur als Java 9-JAR verfügbar ist, bis ich herausgefunden habe, wie mehrere Release-Ziele mit Gradle und dem Bintray-Plugin veröffentlicht werden können.
quelle
Eine kurze und bequeme Möglichkeit, einen String in seine hexadezimale Notation umzuwandeln, ist:
quelle
Überprüfen Sie diese Lösung auf String to hex und Hex to String umgekehrt
Ausgabe wie folgt:
quelle