Bagaimana cara membuat objek python bytes dari string hex panjang?


91

Saya memiliki urutan panjang digit hex dalam sebuah string, seperti

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

hanya lebih lama, beberapa kilobyte. Apakah ada cara bawaan untuk mengubahnya menjadi objek byte di python 2.6 / 3?


4
Perhatikan bahwa jawaban di bawah ini mungkin terlihat sama tetapi mengembalikan jenis nilai yang berbeda. s.decode ('hex') mengembalikan str, seperti halnya unhexlify (s). bytearray.fromhex (s) mengembalikan sebuah bytearray. Mengingat kata-kata dari pertanyaan ini, saya pikir tanda centang hijau besar harus ada di bytearray.fromhex (s), bukan di s.decode ('hex').
Paul Hoffman


2
Bagaimana ini bisa menjadi duplikat dari pertanyaan yang dibuat 2 tahun kemudian?
rekursif

1
@Ciroantant 郝海东 冠状 病 六四 事件 法轮功 String byte bukan array byte. stackoverflow.com/questions/1740696/…
LarsH

Jawaban:


96

Bekerja dengan Python 2.7 dan lebih tinggi termasuk python3:

result = bytearray.fromhex('deadbeef')

Catatan: Sepertinya ada bug dengan bytearray.fromhex()fungsi di Python 2.6. Dokumentasi python.org menyatakan bahwa fungsi tersebut menerima string sebagai argumen, tetapi ketika diterapkan, kesalahan berikut muncul:

>>> 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
Dan satu langkah tambahan, saya menginginkan string byte (misalnya Python 3's b '\ x04 \ xea [...]'), yang bisa Anda dapatkan dari bytearray denganbytes(bytearray.fromhex('deadbeef'))
berto

5
@berto: dalam hal ini ada rute yang lebih langsung dalam bentuk binascii.unhexlify().
Martijn Pieters

1
Terima kasih, @MartijnPieters, saya akan mencobanya
berto

1
Jawaban ini tidak sesuai dengan pertanyaan yang diajukan. Ini mengembalikan array byte yang bisa berubah, bukan bytestring python. Itu seperti mengembalikan array string daripada string.
Mike Martin

2
@ LarsH: metode itu tidak tersedia di rilis Python 2 yang lebih lama. Itu tidak masalah lagi hari ini, tapi itu masalah di 2016.
Martijn Pieters

74
result = bytes.fromhex(some_hex_string)

2
Ini sepertinya cara paling langsung untuk melakukan apa yang diminta oleh postingan asli. Apakah ada alasan mengapa ini bukan jawaban yang diterima?
Sebastian Gaweda

Metode fromhex () (dari byte dan bytearray) juga akan berfungsi ketika nomor hex dipisahkan oleh spasi. Sangat mudah!
Klaws

1
Ini harus menjadi jawaban yang diterima. Jawaban yang diterima saat ini tidak sesuai dengan pertanyaan yang diajukan. Ini mengembalikan array byte yang bisa berubah, bukan bytestring.
Mike Martin

40

Anda dapat melakukan ini dengan codec hex. yaitu:

>>> 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')seharusnya berfungsi untuk 2.x dan 3.x :-)
Abbafei

37

Coba modul binascii

from binascii import unhexlify
b = unhexlify(myhexstr)

9
Dua cara untuk melakukannya dalam 2.x, tiga cara dalam 3.x. Begitu banyak untuk "hanya ada satu cara untuk melakukannya" ...
technomalogical

Dua cara lainnya lebih 'built-in' jadi saya akan benar-benar menggunakan salah satunya.
Crescent Fresh

@technomalogical: komentar Anda tidak relevan dengan jawaban; mungkin Anda harus menghapusnya dan mengubahnya menjadi posting ke comp.lang.python.
tzot

1
@technomalogical: Saya setuju dengan ΤΖΩΤΖΙΟΥ. Juga, Anda salah. Frasa yang benar adalah: Seharusnya ada satu - dan sebaiknya hanya satu - cara yang jelas untuk melakukannya.
nosklo

2
Perhatikan bahwa di Python 3.2 (baik secara desain atau bug, saya tidak yakin) unhexlifysekarang tidak akan menerima string, tetapi hanya byte. Sangat konyol, tetapi itu berarti Anda harus menggunakannyab = unhexlify(bytes(myhexstr, 'utf-8'))
Scott Griffiths

2
import binascii

binascii.a2b_hex(hex_string)

Begitulah cara saya melakukannya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.