HOWTO · Python

String zu Hex in Python

Dieses Tutorial zeigt, wie Sie Zeichenketten in Python in Hexadezimalzahlen konvertieren

Auf dieser Seite

Ein Python-String enthält Text. Eine hexadezimale Ausgabe kann entweder die durch eine Codierung erzeugten Bytes oder den Unicode-Codepoint jedes Zeichens darstellen. Für eine portable Byte-Darstellung wählen Sie eine Codierung, rufen encode() auf und wandeln die Bytes mit bytes.hex() um. UTF-8 ist eine verbreitete Wahl, wenn Nicht-ASCII-Text systemübergreifend erhalten bleiben soll.

Das folgende Beispiel vergleicht für denselben Text die hexadezimale Darstellung der UTF-8-Bytes mit der Darstellung der Codepoints. Für diese Eingabe gibt es zuerst die kompakte hexadezimale UTF-8-Bytefolge, dann die zur besseren Lesbarkeit durch Leerzeichen gruppierten Bytes und schließlich die ungepolsterte Codepoint-Darstellung aus. Die Beschriftungen und Ausgaben im unveränderten Beispiel bleiben Englisch.

Einen Python-String mit encode() und hex() in Hexadezimalzahlen umwandeln

str.encode() wandelt Text mit der angegebenen Codierung in Bytes um. Die Methode hex() des Bytes-Objekts gibt anschließend für jedes Byte zwei hexadezimale Ziffern zurück. Die Codierung ist entscheidend: Beispielsweise wird é in UTF-8 als zwei Bytes codiert. Die hexadezimale Byte-Darstellung lautet daher c3a9, während der Codepoint e9 ist.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

text = "Café"
encoded = text.encode("utf-8")
print(encoded.hex())
print(encoded.hex(" "))
print("".join(hex(ord(character))[2:] for character in text))
436166c3a9
43 61 66 c3 a9
436166e9

Die erste Zeile zeigt die kompakte hexadezimale UTF-8-Bytefolge; in der zweiten ist jedes Byte zur besseren Lesbarkeit durch ein Leerzeichen getrennt. Die dritte Zeile zeigt Codepoints und hat daher eine andere Bedeutung. Verwenden Sie die ungegliederte Form, wenn Sie eine durchgehende hexadezimale Zeichenfolge benötigen. Trennzeichen erleichtern die Prüfung, gehören aber zur zurückgegebenen Zeichenfolge.

binascii.hexlify() als Alternative verwenden

Die Funktion binascii.hexlify() aus der Standardbibliothek wandelt Bytes ebenfalls in hexadezimale Bytes um. Codieren Sie zuerst den String und decodieren Sie anschließend das Ergebnis, wenn der nächste Verarbeitungsschritt einen Python-Textstring erwartet:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import binascii

text = "Café"
hex_text = binascii.hexlify(text.encode("utf-8")).decode("ascii")

Der Wert von hex_text ist 436166c3a9.

Vor dem Decodieren ist der Rückgabewert ein bytes-Objekt mit ASCII-Zeichen, etwa b'436166c3a9'. Die Decodierung mit ASCII ist passend, weil die hexadezimalen Ziffern ASCII-Zeichen sind – unabhängig von der Codierung des ursprünglichen Textes. Diese Methode ist nützlich, wenn eine API ausdrücklich binascii oder eine Byte-Ausgabe erwartet. Für eine normale Textausgabe ist bytes.hex() kürzer.

Zeichen-Codepoints mit ord() und hex() umwandeln

Wenn Sie statt der codierten Bytes den Unicode-Codepoint jedes Zeichens darstellen möchten, wenden Sie ord() auf jedes Zeichen an und übergeben die jeweilige Ganzzahl an hex(). Entfernen Sie das Präfix 0x, wenn Sie nur die Ziffern benötigen. Diese Darstellung unterscheidet sich von UTF-8: Der Codepoint von é ist e9, während die UTF-8-Bytes c3 a9 lauten.

Beim Verketten von Codepoint-Ziffern können Werte unterschiedlicher Länge die Grenzen zwischen den einzelnen Werten unklar machen. Beispielsweise ergeben die Codepoints 0x41 und 0x1f600 ohne Trennzeichen die Folge 411f600. Daraus ist nicht ersichtlich, wo ein Wert endet und der nächste beginnt. Verwenden Sie Trennzeichen oder eine feste Stellenzahl mit Auffüllung, wenn ein anderes Programm die einzelnen Codepoints einlesen muss.

Zwischen codierten Bytes und Zeichen-Codepoints wählen

Verwenden Sie text.encode(encoding).hex(), wenn Sie die Bytes benötigen, die unter einer bestimmten Codierung gespeichert, übertragen oder verglichen werden. Wählen Sie den Ansatz mit ord() nur dann, wenn Sie ausdrücklich Unicode-Codepoints benötigen; er erzeugt nicht die codierte Bytefolge.

Pythons eingebaute Funktion hex() akzeptiert eine Ganzzahl, keinen String. Wird sie direkt auf Text angewendet, tritt ein TypeError auf. Einen numerischen String, der bereits hexadezimale Ziffern enthält, mit int(value, 16) umzuwandeln, ist eine separate Parsing-Aufgabe und keine Möglichkeit, beliebigen Text zu codieren. Für die übliche Umwandlung eines Strings in Hexadezimaldarstellung geben Sie die Codierung an und verwenden Sie encode() gefolgt von hex().