Wie erstelle ich ein Python-Byte-Objekt aus einer langen Hex-Zeichenfolge?


87

Ich habe eine lange Folge von Hex-Ziffern in einer Zeichenfolge, wie z

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

nur viel länger, mehrere Kilobyte. Gibt es eine integrierte Möglichkeit, dies in Python 2.6 / 3 in ein Byte-Objekt zu konvertieren?


3
Beachten Sie, dass die folgenden Antworten möglicherweise gleich aussehen, jedoch unterschiedliche Wertetypen zurückgeben. s.decode ('hex') gibt einen str zurück, ebenso wie unhexlify (s). bytearray.fromhex (s) gibt ein bytearray zurück. Angesichts des Wortlauts dieser Frage denke ich, dass das große grüne Häkchen auf bytearray.fromhex (s) und nicht auf s.decode ('hex') stehen sollte.
Paul Hoffman


1
Wie kann es ein Duplikat einer Frage sein, die 2 Jahre später erstellt wurde?
rekursiv

Antworten:


93

Funktioniert in Python 2.7 und höher, einschließlich Python3:

result = bytearray.fromhex('deadbeef')

Hinweis: Es scheint einen Fehler mit der bytearray.fromhex()Funktion in Python 2.6 zu geben. In der Dokumentation zu python.org wird angegeben, dass die Funktion eine Zeichenfolge als Argument akzeptiert. Bei Anwendung wird jedoch der folgende Fehler ausgegeben:

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str`

7
Und noch einen Schritt, ich wollte eine Byte-Zeichenfolge (z. B. Python 3 'b' \ x04 \ xea [...] '), die Sie von einem Bytearray mit erhalten könnenbytes(bytearray.fromhex('deadbeef'))
bis zum

4
@berto: In diesem Fall gibt es einen direkteren Weg in Form von binascii.unhexlify().
Martijn Pieters

Danke, @MartijnPieters, ich werde es
versuchen

68
result = bytes.fromhex(some_hex_string)

Dies scheint der direkteste Weg zu sein, um das zu tun, was der ursprüngliche Beitrag verlangt. Gibt es einen Grund, warum dies nicht die akzeptierte Antwort ist?
Sebastian Gaweda

40

Sie können dies mit dem Hex-Codec tun. dh:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'

16
codecs.decode('0a0a0a', 'hex_codec')sollte für 2.x und 3.x
funktionieren

37

Probieren Sie das binascii-Modul aus

from binascii import unhexlify
b = unhexlify(myhexstr)

7
Zwei Möglichkeiten, dies in 2.x zu tun, drei Möglichkeiten in 3.x. Soviel zu "Es gibt nur einen Weg, es zu tun" ...
technomalogisch

Andere zwei Möglichkeiten sind mehr "eingebaut", also würde ich tatsächlich eine davon verwenden.
Crescent Fresh

@technomalogical: Ihr Kommentar ist für die Antwort irrelevant; Vielleicht sollten Sie es löschen und in einen Beitrag in comp.lang.python ändern.
Zot

1
@technomalogical: Ich stimme ΤΖΩΤΖΙΟΥ zu. Du hast es auch falsch verstanden. Der richtige Satz lautet: Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun.
Nosklo

2
Beachten Sie, dass in Python 3.2 (ob beabsichtigt oder fehlerhaft, ich bin mir nicht sicher) unhexlifyjetzt keine Zeichenfolge mehr akzeptiert wird, sondern nur Bytes. Eigentlich ziemlich albern, aber es bedeutet, dass Sie verwenden müssenb = unhexlify(bytes(myhexstr, 'utf-8'))
Scott Griffiths

1
import binascii

binascii.a2b_hex(hex_string)

So habe ich es gemacht.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.