2012-10-16 25 views
22

Trong Python 2, để có được một chuỗi đại diện của các chữ số thập lục phân trong một chuỗi, bạn có thể làmCách sử dụng mã hóa 'hex' trong Python 3.2 hoặc cao hơn?

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

Trong Python 3, điều đó không có tác dụng nữa (thử nghiệm trên Python 3.2 và 3.3):

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

có ít nhất one answer đây trên SO đề cập đến rằng hex bộ giải mã đã được gỡ bỏ bằng Python 3. Nhưng sau đó, according to the docs, nó lại được đưa vào trong Python 3.2, như là một "byte-to-byte lập bản đồ".

Tuy nhiên, tôi không biết làm thế nào để có được những "byte-to-byte ánh xạ" để làm việc:

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

Và các tài liệu không đề cập rằng một trong hai (ít nhất không phải là nơi tôi nhìn) . Tôi phải thiếu một cái gì đó đơn giản, nhưng tôi không thể nhìn thấy nó là gì.

+0

thấy câu trả lời này: http: // stackoverflow.com/a/2340358/1298523 – scape

+2

Tôi sẽ tranh luận chống lại việc này như một sự lừa đảo. Câu hỏi này đặc biệt về Python 3.2, nơi mà codec 'hex' được chính thức quay trở lại (nhưng khó tìm hơn). Câu hỏi được liên kết là về Python 3.1. –

Trả lời

24

Bạn cần phải đi qua codecs Module và hex_codec codec (hoặc hex bí danh của nó nếu có *):

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

* Từ các tài liệu: "Thay đổi trong phiên bản 3.4: Phục hồi các bí danh cho biến đổi nhị phân ".

+4

Bạn không có nghĩa là 'codecs.encode (b '\ x12', 'hex_codec')'? Với ''hex'' tôi chỉ nhận' LookupError: mã hóa không xác định: hex' – mata

+3

Các tài liệu nói 'hex' là một bí danh trong 3.2, nhưng cài đặt 3.2.3 của tôi có cùng lỗi. –

+2

Trong khi tôi không thể tìm thấy một tham chiếu đến một bugfix, có vẻ như 'hex' đang hoạt động trở lại như của 3.4. –

13

Tuy nhiên, một cách khác sử dụng binascii.hexlify():

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

Vì vậy, bạn đã liếc qua cái gọi là dupe, vâng? :) –

+1

Không, đó là cách tôi thường làm điều đó :) –

6

binascii phương pháp được dễ dàng hơn bằng cách này:

>>> 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')' là tốt hơn đánh vần 'x.decode ('ascii')' – Eric

+2

'binascii' cũng có vẻ nhanh hơn, cho bất cứ ai quan tâm . –

Các vấn đề liên quan