2012-10-16 9 views
22

W Pythonie 2, aby uzyskać reprezentację ciąg cyfr szesnastkowych w ciąg, można zrobićJak korzystać z kodowania "hex" w Pythonie 3.2 lub nowszym?

>>> '\x12\x34\x56\x78'.encode('hex') 
'12345678' 

w Pythonie 3, to już nie działa (testowane na Pythonie 3.2 i 3.3):

>>> '\x12\x34\x56\x78'.encode('hex') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
LookupError: unknown encoding: hex 

Istnieje co najmniej one answer tu tak, że wskazuje, że kodek hex usunięto Pythona 3. potem, according to the docs, został ponownie w Pythonie 3.2, jako „mapowanie bajtów, do bajtów”.

Jednak nie wiem jak uzyskać te „bajtów-do-mapowania bajtów” do pracy:

>>> b'\x12'.encode('hex') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'bytes' object has no attribute 'encode' 

I docs nie wspomnieć, że albo (przynajmniej nie tam, gdzie spojrzałem) . Muszę przegapić coś prostego, ale nie widzę, co to jest.

+0

zobaczyć tę odpowiedź: http: // stackoverflow.com/a/2340358/1298523 – scape

+2

Chciałbym się spierać przed zamknięciem tego jako dupe. To pytanie dotyczy konkretnie Python 3.2, gdzie kodek 'hex' jest oficjalnie z powrotem (ale trudniejszy do znalezienia). Powiązane pytanie dotyczy Python 3.1. –

Odpowiedz

24

Musisz przejść przez moduł codecs i kodeka hex_codec (lub jego hex alias jeżeli są dostępne *):

codecs.encode(b'\x12', 'hex_codec') 

* Z dokumentacji: „Zmieniono w wersji 3.4: Przywrócenie aliasy dla transformacji binarnych ".

+4

Nie masz na myśli 'codecs.encode (b '\ x12', 'hex_codec')'? Z '' hex'' mam tylko 'LookupError: unknown encoding: hex' – mata

+3

Dokumenty mówią, że' hex' jest aliasem w 3.2, ale moja 3.2.3 instalacja miała ten sam błąd. –

+2

Chociaż nie mogę znaleźć odniesienia do poprawki, wygląda na to, że 'hex' działa ponownie od wersji 3.4. –

13

Jeszcze innym sposobem korzystania binascii.hexlify():

>>> import binascii 
>>> binascii.hexlify(b'\x12\x34\x56\x78') 
b'12345678' 
+0

Więc rzuciłeś okiem na tak zwany dupek, tak? :) –

+1

Nie, tak to zazwyczaj robię :) –

6

binascii metody są łatwiejsze przy okazji:

>>> 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' 
+0

'str (x, 'ascii')' jest lepiej napisane 'x.decode ('ascii')' – Eric

+2

'binascii' również wydaje się szybsze, dla każdego, kogo to obchodzi . –

Powiązane problemy