Wie konvertiere ich eine hexadezimale Zeichenfolge in Bytes in Python?

Lesezeit: 2 Minuten

Richards Benutzeravatar
Richard

Ich habe eine lange Hex-Zeichenfolge, die eine Reihe von Werten verschiedener Typen darstellt. Ich muss diesen Hex-String umwandeln in bytes oder bytearray damit ich jeden Wert aus den Rohdaten extrahieren kann. Wie kann ich das machen?

Zum Beispiel die Zeichenfolge "ab" sollte in die Bytes konvertieren b"\xab" oder gleichwertiges Byte-Array. Längeres Beispiel:

>>> # what to use in place of `convert` here?
>>> convert("8e71c61de6a2321336184f813379ec6bf4a3fb79e63cd12b")
b'\x8eq\xc6\x1d\xe6\xa22\x136\x18O\x813y\xeck\xf4\xa3\xfby\xe6<\xd1+'

  • Wie sieht dieser Hex-String aus?

    – Chatschik

    13. April 2011 um 12:46 Uhr

Benutzeravatar von tzot
tzot

Angenommen, Ihre Hex-Zeichenfolge ist so etwas wie

>>> hex_string = "deadbeef"

Konvertieren Sie es in ein Bytearray (Python 3 und 2.7):

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

Konvertieren Sie es in ein Bytes-Objekt (Python 3):

>>> bytes.fromhex(hex_string)
b'\xde\xad\xbe\xef'

Beachten Sie, dass bytes ist eine unveränderliche Version von bytearray.

Konvertieren Sie es in einen String (Python ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

  • Notiz Das bytes.fromhex wirft einen Fehler, wenn die Eingabezeichenfolge eine ungerade Anzahl von Zeichen hat: bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3.

    – Константин Ван

    24. Juli 2018 um 17:35 Uhr


  • Die neue Version von hex_string.decode("hex") Ist codecs.decode(hex_string, 'hex').

    – wjandrea

    30. Juni 2022 um 19:42 Uhr

Es gibt eine eingebaute Funktion in bytearray, die tut, was Sie beabsichtigen.

bytearray.fromhex("de ad be ef 00")

Es gibt ein Bytearray zurück und liest Hex-Strings mit oder ohne Leerzeichen.

  • Die beste Antwort mit Sicherheit!

    – Maiku Mori

    5. Juni 2014 um 11:33 Uhr

  • Dies funktioniert in Python 3, während hex_string.decode("hex") nicht.

    – Eric O. Lebigot

    22. Februar 2015 um 10:22 Uhr

Wenn ich das richtig verstanden habe, sollten Sie nach binascii.unhexlify suchen

import binascii
a="45222e"
s=binascii.unhexlify(a)
b=[ord(x) for x in s]

  • I stimme zu unhexlify ist der effizienteste Weg, hierher zu kommen, aber ich würde das vorschlagen b = bytearray(s) wäre besser als zu verwenden ord. Da Python einen eingebauten Typ nur für Arrays von Bytes hat, bin ich überrascht, dass ihn niemand verwendet

    – Scott Griffiths

    13. April 2011 um 15:03 Uhr


Angenommen, Sie haben eine solche Bytefolge

“\x12\x45\x00\xAB”

und Sie die Anzahl der Bytes und ihren Typ kennen, können Sie auch diesen Ansatz verwenden

import struct

bytes="\x12\x45\x00\xAB"
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

Da ich Little Endian (mit dem Zeichen ‘<') am Anfang der Formatzeichenfolge angegeben habe, gab die Funktion das Dezimaläquivalent zurück.

0x12 = 18

0x45 = 69

0xAB00 = 43776

B entspricht einem Byte (8 Bit) ohne Vorzeichen

H ist gleich zwei Bytes (16 Bit) ohne Vorzeichen

Weitere verfügbare Zeichen und Bytegrößen finden Sie hier

Die Vorteile sind..

Sie können mehr als ein Byte und das Endian der Werte angeben

Nachteile..

Sie müssen wirklich die Art und Länge der Daten kennen, mit denen Sie es zu tun haben

velsims Benutzeravatar
velsim

Du kannst den … benutzen Codecs-Modul in der Python-Standardbibliothek, dh

import codecs

codecs.decode(hexstring, 'hex_codec')

Benutzeravatar von unwind
entspannen

Sie sollten in der Lage sein, eine Zeichenfolge mit den Binärdaten zu erstellen, indem Sie Folgendes verwenden:

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

Dies ist wahrscheinlich nicht der schnellste Weg (viele String-Anhänge), aber ganz einfach, wenn nur Kern-Python verwendet wird.

Benutzeravatar von karlw
karlw

Ein guter Einzeiler ist:

byte_list = map(ord, hex_string)

Dadurch wird jedes Zeichen in der Zeichenfolge durchlaufen und durch die Funktion ord() ausgeführt. Nur auf Python 2.6 getestet, bei 3.0+ nicht ganz sicher.

-Josch

  • perfekt. Arbeiten an Python 2.7

    – Richard

    13. April 2011 um 13:06 Uhr

  • Klicken Sie auf den Umriss des Häkchens neben dieser Antwort, wenn es die richtige ist! 🙂

    – Jathanismus

    13. April 2011 um 13:54 Uhr

  • Dies konvertiert kein Hex – es konvertiert jedes Zeichen einer Zeichenfolge in eine Ganzzahl. Bei Hex würde jedes Zeichenpaar ein Byte darstellen. Kannst du auch einfach sagen byte_list = bytearray(hex_string)

    – Scott Griffiths

    13. April 2011 um 15:11 Uhr

1443310cookie-checkWie konvertiere ich eine hexadezimale Zeichenfolge in Bytes in Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy