it-swarm.com.de

Python 3.1.1 String zu Hex

Ich versuche, str.encode() zu verwenden, aber ich bekomme

>>> "hello".encode(hex)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method

Ich habe eine Reihe von Variationen ausprobiert und sie scheinen alle in Python 2.5.2 zu funktionieren. Was muss ich tun, damit sie in Python 3.1 funktionieren?

50
Stuart

Der hex-Codec wurde in 3.x eingespannt. Verwenden Sie stattdessen binascii :

>>> binascii.hexlify(b'hello')
b'68656c6c6f'

Sie haben bereits einige gute Antworten erhalten, aber ich dachte, Sie könnten sich auch für ein wenig Hintergrund interessieren.

Zunächst fehlen Ihnen die Anführungszeichen. Es sollte sein:

"hello".encode("hex")

Zweitens wurde dieser Codec nicht auf Python 3.1 portiert. Siehe hier . Es scheint, dass sie noch nicht entschieden haben, ob diese Codecs in Python 3 enthalten sein sollen oder nicht.

Wenn Sie die mit diesem Fehler verknüpfte diff-Datei betrachten, können Sie die vorgeschlagene Implementierungsmethode sehen:

import binascii
output = binascii.b2a_hex(input)
20
Mark Byers

binascii-Methoden sind übrigens einfacher

>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'

Ich hoffe es hilft. :)

17
iMagur

Kodieren Sie den String in Python 3 in Bytes und verwenden Sie die hex()-Methode, wobei Sie einen String zurückgeben.

s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'

Konvertieren Sie optional den String zurück in Bytes:

b = bytes(s, "utf-8")
b
# b'68656c6c6f'
10
pylang

In Python 3 sind alle Zeichenfolgen Unicode. Wenn Sie ein Unicode-Objekt in eine Zeichenfolge codieren, verwenden Sie normalerweise .encode('TEXT_ENCODING'). Da hex keine Textcodierung ist, sollten Sie codecs.encode() verwenden, um beliebige Codecs zu verarbeiten. Zum Beispiel:

>>>> "hello".encode('hex')
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", 'hex')
b'68656c6c6f'

Da "Hallo" Unicode ist, müssen Sie ihn vor dem Kodieren in Hexadezimalzeichen als Byte-Zeichenfolge angeben. Dies entspricht möglicherweise eher dem ursprünglichen Ansatz der encode-Methode.

Die Unterschiede zwischenbinascii.hexlifyundcodecs.encodesind wie folgt:

  • binascii.hexlify

    Hexadezimale Darstellung von Binärdaten.

    Der Rückgabewert ist ein Byte-Objekt.

    Geben Sie Folgendes ein: builtin_function_or_method

  • codecs.encode

    encode (obj, [encodierung [ fehler]]) -> object

    Codiert obj mit dem für die Codierung registrierten Codec. Standardwerte für die Kodierung zur Standardkodierung. Fehler können angegeben werden, um ein anderes Fehlerbehandlungsschema festzulegen. Der Standardwert ist 'strict', was bedeutet, dass bei Codierungsfehlern __. Ein ValueError ausgelöst wird. Andere mögliche Werte sind 'ignore', 'replace' und 'Xmlcharrefreplace' sowie jeder andere Name, der bei Codecs.register_error registriert ist und ValueErrors verarbeiten kann.

    Geben Sie Folgendes ein: builtin_function_or_method

7
Devy

base64.b16encode und base64.b16decode konvertiert Bytes von und nach Hex und arbeitet mit allen Python-Versionen. Der Codecs-Ansatz funktioniert ebenfalls, ist jedoch in Python 3 weniger einfach.

6
Gabriel
3
Ofir

Noch eine andere Methode:

s = 'hello'

h = ''.join([hex(ord(i)) for i in s]);

# outputs: '0x680x650x6c0x6c0x6f'

Dies teilt die Zeichenfolge im Wesentlichen in Zeichen auf, führt die Konvertierung durch hex(ord(char)) durch und fügt die Zeichen zusammen. Wenn Sie das Ergebnis ohne das Präfix 0x wünschen, dann führen Sie Folgendes aus:

h = ''.join([str(hex(ord(i)))[2:4] for i in s]);

# outputs: '68656c6c6f'

Mit Python getestet 3.5.3.

0
Francis Laclé

Der einfachste Weg, dies in Python 3.x zu tun, ist:

>>> 'halo'.encode().hex()
'68616c6f'

Wenn Sie manuell einen String in einen Python-Interpreter eingeben mit den utf-8-Zeichen, können Sie dies noch schneller tun, indem Sie b vor dem String eingeben:

>>> b'halo'.hex()
'68616c6f'

Äquivalent in Python 2.x:

>>> 'halo'.encode('hex')
'68616c6f'
0
simhumileco