89 Stimmen

Hex-String in Python 3 dekodieren

In Python 2 war es einfach, die hexadezimale Form einer Zeichenkette in den entsprechenden Unicode zu konvertieren:

comments.decode("hex")

wobei die Variable "comments" ein Teil einer Zeile in einer Datei ist (der Rest der Zeile ist pas müssen konvertiert werden, da sie nur in ASCII dargestellt sind.

Jetzt in Python 3, jedoch funktioniert dies nicht (ich nehme an, wegen der Bytes/String vs. String/unicode Schalter. Ich habe das Gefühl, dass es in Python 3 einen Einzeiler geben sollte, um das Gleiche zu tun, anstatt die gesamte Zeile als eine Reihe von Bytes zu lesen (was ich nicht tun möchte) und dann jeden Teil der Zeile separat zu konvertieren. Wenn es möglich ist, möchte ich die gesamte Zeile als Unicode-String lesen (weil der Rest der Zeile in Unicode ist) und nur diesen einen Teil aus einer hexadezimalen Darstellung konvertieren.

0 Stimmen

Ich bin mir nicht sicher, ob die Hex-Codierung von Zeichenketten so viel Sinn macht. Wenn Sie eine inkompatible Kodierung speichern wollen, würde ich zumindest Base 64 verwenden, weil das effizienter ist. Das entkräftet die Frage/Antwort natürlich in keiner Weise, vielleicht hat sich jemand anderes für Hex entschieden.

151voto

unbeli Punkte 28027

Etwa so:

>>> bytes.fromhex('4a4b4c').decode('utf-8')
'JKL'

Geben Sie einfach die tatsächliche Kodierung an, die Sie verwenden.

26voto

Niklas Punkte 20301
import codecs

decode_hex = codecs.getdecoder("hex_codec")

# for an array
msgs = [decode_hex(msg)[0] for msg in msgs]

# for a string
string = decode_hex(string)[0]

0voto

HackerBoss Punkte 813

Die Antworten von @unbeli und @Niklas sind gut, aber @unbelis Antwort funktioniert nicht für alle hexadezimalen Zeichenfolgen und es ist wünschenswert, die Dekodierung ohne den Import einer zusätzlichen Bibliothek (Codecs) durchzuführen. Die folgende Lösung sollte funktionieren (ist aber bei großen Zeichenketten nicht sehr effizient):

>>> result = bytes.fromhex((lambda s: ("%s%s00" * (len(s)//2)) % tuple(s))('4a82fdfeff00')).decode('utf-16-le')
>>> result == '\x4a\x82\xfd\xfe\xff\x00'
True

Im Grunde umgeht es ungültige utf-8-Bytes, indem es sie mit Nullen auffüllt und als utf-16 dekodiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X