2011-07-08 71 views
83

Cách chính xác để chuyển đổi byte thành chuỗi hex trong Python 3 là gì?Cách chính xác để chuyển đổi byte thành chuỗi hex trong Python 3 là gì?

Tôi thấy xác nhận quyền sở hữu của phương pháp bytes.hex, bytes.decode codec và đã thử other các chức năng có thể có ít ngạc nhiên nhất mà không có kết quả. Tôi chỉ muốn byte của tôi là hex!

+0

"mà không avail"? Bạn gặp phải những vấn đề ** hoặc lỗi ** cụ thể nào? Vui lòng hiển thị mã và lỗi. –

+0

Có thể trùng lặp của http://stackoverflow.com/questions/2340319/python-3-1-1-string-to-hex –

Trả lời

75

Sử dụng binascii mô-đun:

>>> import binascii 
>>> binascii.hexlify('foo'.encode('utf8')) 
b'666f6f' 
>>> binascii.unhexlify(_).decode('utf8') 
'foo' 

Xem câu trả lời này: Python 3.1.1 string to hex

+6

Điều này là tốt. Tâm boggling là bạn có thể chuyển đổi hex sang byte bằng cách sử dụng byte.fromhex (hex_str), nhưng bạn không thể chuyển đổi byte sang hex bằng cách sử dụng byte.tohex() - lý do trong điều này là gì? – nagylzs

+1

Tôi đoán mối quan hệ giữa byte và hex không phải là thuộc tính của một trong hai (không trả lời tại sao có từ đó). Có vẻ như nó không chỉ là một sự giám sát mà còn được tranh luận về: http://bugs.python.org/issue3532#msg70950. Hỏi: Liệu nó có bị tổn thương khi có phương thức tohex của đối tượng byte để thực hiện tác vụ này không? A: IMO, có, nó sẽ. Nó làm phức tạp mã, và rút tập trung ra khỏi phương pháp thích hợp để chuyển đổi dữ liệu (cụ thể là, các hàm - không phải là các phương thức). –

+2

Điều này thực sự trả lời câu hỏi? Nó không trả về một hex 'str' nhưng là một' byte'. Tôi biết rằng OP có vẻ hài lòng với câu trả lời nhưng sẽ không tốt hơn để mở rộng câu trả lời này để bao gồm '.decode (" ascii ")' cũng để chuyển đổi nó thành "chuỗi" – ecerulm

27

Python có byte-to-byte standard codecs mà thực hiện biến đổi thuận tiện như quoted-in (phù hợp với ascii 7bits), base64 (phù hợp với chữ và số), hex thoát, nén gzip và bz2. Trong Python 2, bạn có thể làm:

b'foo'.encode('hex') 

bằng Python 3, str.encode/bytes.decode là đúng cho byte < -> str chuyển đổi. Thay vào đó, bạn có thể làm được điều này, mà làm việc trên Python 2 và Python 3 (s/mã hóa/giải mã/g cho nghịch đảo):

import codecs 
codecs.getencoder('hex')(b'foo')[0] 

Bắt đầu với Python 3.4, có một lựa chọn ít lúng túng:

codecs.encode(b'foo', 'hex') 

Các codec linh tinh này cũng có thể truy cập bên trong mô-đun riêng của chúng (base64, zlib, bz2, uu, quopri, binascii); API ít nhất quán, nhưng đối với các codec nén, nó cung cấp khả năng kiểm soát nhiều hơn.

+1

sử dụng python 3.3: 'LookupError: mã hóa không xác định: hex' –

+0

@JanusTroelsen: thử ['hex_codec'] (http://stackoverflow.com/a/22465079/4279). Hoặc chỉ sử dụng 'binascii.hexlify (b'foo ')' trực tiếp – jfs

7
import codecs 
codecs.getencoder('hex_codec')(b'foo')[0] 

hoạt động trong Python 3.3 (do đó "hex_codec" thay vì "hex").

+0

Có lẽ thú vị, trong Python 3.4 "hex" hoặc "hex_codec" hoạt động tốt. –

3

Phương pháp binascii.hexlify() sẽ chuyển đổi bytes thành bytes đại diện cho chuỗi hex ascii. Điều đó có nghĩa là mỗi byte trong đầu vào sẽ được chuyển đổi thành hai ký tự ascii. Nếu bạn muốn có một số str thực thì bạn có thể .decode("ascii") kết quả.

Tôi đã bao gồm một đoạn mã minh họa.

import binascii 

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls' 
    in_bytes = f.read() 
    print(in_bytes) # b'\n\x16\n\x04' 
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes 
    hex_str = hex_bytes.decode("ascii") 
    print(hex_str) # 0a160a04 

từ chuỗi hex "0a160a04" để có thể quay trở lại bytes với binascii.unhexlify("0a160a04") mang đến cho trở lại b'\n\x16\n\x04'

118

Kể từ Python 3.5 này là cuối cùng không còn lúng túng:

>>> b'\xde\xad\xbe\xef'.hex() 
'deadbeef' 

và đảo ngược:

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

cũng hoạt động với loại bytearray có thể thay đổi.

+1

Tham khảo: https://docs.python.org/3/library/stdtypes.html#bytes.hex – minexew

0

Nếu bạn muốn chuyển đổi b '\ X61' đến 97 hoặc '0x61', bạn có thể thử này:

[python3.5] 
>>>from struct import * 
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int 
97 
>>>hex(temp) ##convert int to string which is hexadecimal expression 
'0x61' 

tham khảo: https://docs.python.org/3.5/library/struct.html

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