Làm thế nào để tạo đối tượng python byte từ chuỗi hex dài?


89

Tôi có một chuỗi dài các chữ số hex trong một chuỗi, chẳng hạn như

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

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


4
Lưu ý rằng các câu trả lời bên dưới có thể giống nhau nhưng chúng trả về các loại giá trị khác nhau. s.decode ('hex') trả về một str, cũng như (các) không giải thích. bytearray.fromhex (s) trả về một bytearray. Với cách diễn đạt của câu hỏi này, tôi nghĩ dấu kiểm lớn màu xanh lá cây nên nằm trên bytearray.fromhex (s), không phải trên s.decode ('hex').
Paul Hoffman


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

1
@CiroSantilli 郝海东 冠状 病 六四 事件 法轮功 Chuỗi byte không phải là mảng byte. stackoverflow.com/questions/1740696/…
LarsH

@LarsH đủ công bằng. @ đệ quy: ngày không phải là yếu tố chính: meta.stackexchange.com/questions/147643/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Câu trả lời:


95

Hoạt động trong Python 2.7 trở lên bao gồm cả python3:

result = bytearray.fromhex('deadbeef')

Lưu ý: Có vẻ như có một lỗi với bytearray.fromhex()hàm trong Python 2.6. Tài liệu python.org nói rằng hàm chấp nhận một chuỗi làm đối số, nhưng khi được áp dụng, lỗi sau sẽ được đưa ra:

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

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

5
@berto: trong trường hợp đó có một tuyến đường trực tiếp hơn ở dạng binascii.unhexlify().
Martijn Pieters

1
Cảm ơn, @MartijnPieters, tôi sẽ thử nó
berto

1
Câu trả lời này không làm những gì câu hỏi đã yêu cầu. Nó trả về một mảng byte có thể thay đổi, không phải là một chuỗi thử nghiệm của python. Điều đó giống như trả về một mảng chuỗi thay vì một chuỗi.
Mike Martin

1
@LarsH: phương pháp đó không khả dụng trong các bản phát hành Python 2 cũ hơn. Điều đó ngày nay không còn quan trọng nữa, nhưng nó đã là một vấn đề của năm 2016.
Martijn Pieters

73
result = bytes.fromhex(some_hex_string)

2
Đây dường như là cách trực tiếp nhất để thực hiện những gì mà bài viết gốc đang yêu cầu. Có lý do gì mà đây không phải là câu trả lời được chấp nhận?
Sebastian Gaweda

Phương thức fromhex () (của cả byte và bytearray) cũng sẽ hoạt động khi các số hex được phân tách bằng dấu cách. Rât thuận tiện!
Klaws

1
Đây thực sự nên là câu trả lời được chấp nhận. Câu trả lời được chấp nhận hiện tại không làm được những gì câu hỏi đã hỏi. Nó trả về một mảng byte có thể thay đổi, không phải là một chuỗi kiểm tra.
Mike Martin

40

Bạn có thể làm điều này với codec hex. I E:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'

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

37

Thử mô-đun binascii

from binascii import unhexlify
b = unhexlify(myhexstr)

9
Hai cách để thực hiện trong 2.x, ba cách trong 3.x. Rất nhiều cho "chỉ có một cách để làm điều đó" ...
technomalogical

Hai cách khác được 'tích hợp' nhiều hơn, vì vậy tôi thực sự sẽ sử dụng một trong những cách đó.
Crescent Fresh vào

@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 đăng để comp.lang.python.
tzot

1
@technomalogical: Tôi đồng ý với ΤΖΩΤΖΙΟΥ. Ngoài ra, bạn đã nhầm. Cụm từ đúng là: Nên có một - và tốt nhất là chỉ một - cách hiển nhiên để làm điều đó.
nosklo

2
Lưu ý rằng trong Python 3.2 (cho dù do thiết kế hay lỗi mà tôi không chắc) unhexlifybây giờ sẽ không chấp nhận một chuỗi mà chỉ chấp nhận byte. Thực sự khá ngớ ngẩn, nhưng nó có nghĩa là bạn cần phải sử dụngb = unhexlify(bytes(myhexstr, 'utf-8'))
Scott Griffiths

2
import binascii

binascii.a2b_hex(hex_string)

Đó là cách tôi đã làm nó.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.