2009-01-14 65 views
50

Tôi có một chuỗi dài các chữ số hex trong một chuỗi, chẳng hạn nhưCách tạo đối tượng byte python từ chuỗi dài hex?

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

chỉ lâu hơn nữa, vài kilobyte. Có cách nào được xây dựng để chuyển đổi này thành một đối tượng byte trong python 2.6/3?

+3

Lưu ý rằng các câu trả lời dưới đây có thể trông giống nhau nhưng họ trở về các loại khác nhau của các giá trị . s.decode ('hex') trả về một str, cũng như unhexlify (s). bytearray.fromhex (s) trả về một bytearray. Với từ ngữ của câu hỏi này, tôi nghĩ rằng dấu kiểm màu xanh lá cây lớn nên được trên bytearray.fromhex (s), không phải trên s.decode ('hex'). –

+0

Bản sao có thể có của [chuỗi thập lục phân đến byte trong python] (http://stackoverflow.com/questions/5649407/hexadecimal-string-to-byte-array-in-python) –

+0

Làm thế nào nó có thể là một bản sao của một câu hỏi tạo ra 2 năm sau? – recursive

Trả lời

35

trình bằng Python 2.7 và cao hơn bao gồm python3:

result = bytearray.fromhex('deadbeef') 

Lưu ý: Có vẻ là một lỗi với bytearray.fromhex() hàm trong Python 2.6. Các tài liệu python.org khẳng định rằng chức năng chấp nhận một chuỗi như một cuộc tranh cãi, nhưng khi áp dụng, các lỗi sau được ném:

>>> bytearray.fromhex('B9 01EF') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: fromhex() argument 1 must be unicode, not str` 
+2

Và một bước bổ sung, tôi muốn chuỗi byte (ví dụ: Python 's b' \ x04 \ xea [...] '), mà bạn có thể nhận được từ một bytearray với 'byte (bytearray.fromhex (' deadbeef '))' – berto

+2

@berto: trong trường hợp đó là một tuyến đường trực tiếp hơn dưới dạng 'binascii.unhexlify()'. –

+0

Xin cảm ơn, @MartijnPieters, tôi sẽ thực hiện một cảnh quay – berto

28

Thử binascii module

from binascii import unhexlify 
b = unhexlify(myhexstr) 
+4

Hai cách để làm điều đó trong 2.x, ba cách trong 3.x. Vì vậy, nhiều cho "chỉ có một cách để làm điều đó" ... – technomalogical

+0

Hai cách khác là nhiều hơn 'được xây dựng trong' vì vậy tôi sẽ thực sự sử dụng một trong những người. –

+0

@technomalogical: nhận xét của bạn không liên quan đến câu trả lời; có lẽ bạn nên xóa nó và thay đổi nó thành một bài viết để comp.lang.python. – tzot

39

Bạn có thể làm điều này với các codec hex. ví dụ:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44' 
>>> s.decode('hex') 
'\x00\x00\x00\x00\x00\[email protected]\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\[email protected]\xa4=P\x05\xbdD' 
+23

Chỉ hoạt động trong 2.x, chứ không phải 3.x. –

+9

'codecs.decode ('0a0a0a', 'hex_codec')' sẽ hoạt động cho 2.x và 3.x :-) – Abbafei

32
result = bytes.fromhex(some_hex_string) 
+10

Chỉ hoạt động trong Python 3+ nếu tôi không nhầm – Triptych

-2
import binascii 

binascii.b2a_hex(obj) 
Các vấn đề liên quan