Was ist der richtige Weg, um Bytes in Python 3 in eine Hex-Zeichenfolge zu konvertieren?
Ich sehe Behauptungen einer bytes.hex
Methode, bytes.decode
Codecs, und habe andere mögliche Funktionen des geringsten Erstaunens ohne Erfolg ausprobiert . Ich möchte nur meine Bytes als Hex!
python
python-3.x
hex
Matt Joiner
quelle
quelle
Antworten:
Seit Python 3.5 ist dies endlich nicht mehr umständlich:
und umgekehrt:
funktioniert auch mit dem veränderlichen
bytearray
Typ.Referenz: https://docs.python.org/3/library/stdtypes.html#bytes.hex
quelle
bytes.fromhex()
ist auch für Python 3.0+ verfügbar (nicht nur für 3.5+).bytes.hex()
ist nur auf Python 3.5+.Verwenden Sie das
binascii
Modul:Siehe diese Antwort: Python 3.1.1 String zu hex
quelle
str
sondern ein Hexbytes
. Ich weiß, dass das OP mit der Antwort zufrieden zu sein scheint, aber es wird nicht besser sein, diese Antwort zu erweitern.decode("ascii")
, um sie auch in einen "String"bytes
. Wenn Sieprint(b'666f6f')
dasb
im Ausdruck bekommen. Wenn Sie.decode("ascii")
dann nicht. Ich denke nur daran, wie diejenigen, die tatsächlich einebytes
(echte Binärdatei mit Elementen> 128, keine ASCII-Zeichenfolge) hatten, diese ausdrucken wollten..hex()
Methode in Python 3.5+Python verfügt über Standard-Codecs von Byte zu Byte , die bequeme Transformationen ausführen, z. B. in Anführungszeichen druckbar (passt in 7-Bit-ASCII), Base64 (passt in alphanumerische Zeichen), Hex-Escape, Gzip- und BZ2-Komprimierung. In Python 2 können Sie Folgendes tun:
In Python 3 sind
str.encode
/bytes.decode
ausschließlich für Bytes <-> str-Konvertierungen. Stattdessen können Sie dies tun, was in Python 2 und Python 3 funktioniert ( s / encode / decode / g für die Umkehrung):Ab Python 3.4 gibt es eine weniger umständliche Option:
Auf diese verschiedenen Codecs kann auch in ihren eigenen Modulen zugegriffen werden (base64, zlib, bz2, uu, quopri, binascii). Die API ist weniger konsistent, bietet jedoch für Komprimierungscodecs mehr Kontrolle.
quelle
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
direktfunktioniert in Python 3.3 (also "hex_codec" anstelle von "hex").
quelle
Die Methode
binascii.hexlify()
konvertiertbytes
in einebytes
Darstellung der ASCII-Hex-Zeichenfolge. Das bedeutet, dass jedes Byte in der Eingabe in zwei ASCII-Zeichen konvertiert wird. Wenn Sie ein echtesstr
Out wollen , dann können Sie.decode("ascii")
das Ergebnis.Ich habe einen Ausschnitt beigefügt, der dies veranschaulicht.
Von der Hex-Zeichenfolge
"0a160a04"
bis kann man zu dem zurückkehren,bytes
mitbinascii.unhexlify("0a160a04")
dem man zurückgibtb'\n\x16\n\x04'
quelle
OK, die folgende Antwort geht etwas über den Rahmen hinaus, wenn Sie sich nur für Python 3 interessieren. Diese Frage ist jedoch der erste Google-Treffer, auch wenn Sie die Python-Version nicht angeben. Hier ist eine Methode, die sowohl für Python 2 als auch für Python 3 funktioniert .
Ich interpretiere die Frage auch so, dass es darum geht, Bytes in den
str
Typ zu konvertieren : Bytes-y in Python 2 und Unicode-y in Python 3.Angesichts dessen ist der beste Ansatz, den ich kenne ,:
Die folgende Behauptung gilt entweder für Python 2 oder Python 3, vorausgesetzt, Sie haben die
unicode_literals
Zukunft in Python 2 nicht aktiviert :(Oder Sie können verwenden
''.join()
, um den Abstand zwischen den Bytes usw. wegzulassen.)quelle
Es kann der Formatbezeichner verwendet werden
%x02
, der einen Hex-Wert formatiert und ausgibt. Beispielsweise:quelle
res.upper()
Neu in Python 3.8 können Sie
hex
wie in diesem Beispiel ein Trennzeichenargument an die Funktion übergebenhttps://docs.python.org/3/library/stdtypes.html#bytes.hex
quelle
Wenn Sie b '\ x61' in 97 oder '0x61' konvertieren möchten, können Sie Folgendes versuchen:
Referenz: https://docs.python.org/3.5/library/struct.html
quelle