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?

rekursiv
quelle
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
Mögliches Duplikat der hexadezimalen Zeichenfolge zum Byte-Array in Python
Ciro Santilli 法轮功 冠状 病 六四 事件 17
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`
Jim Garrison
quelle
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)
vili
quelle
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'
Brian
quelle
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)
Halbmond frisch
quelle
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.

JustPlayin
quelle
-3
import binascii

binascii.b2a_hex(obj)
Zubair Khalid
quelle