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?

rekursif
sumber
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
1
Kemungkinan duplikat string heksadesimal ke byte array dalam python
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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
@Lukmania @ rekursif: tanggal bukanlah faktor utama: meta.stackexchange.com/questions/147643/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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`
Jim Garrison
sumber
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)
vili
sumber
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'
Brian
sumber
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)
Crescent Fresh
sumber
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.

JustPlayin
sumber
-3
import binascii

binascii.b2a_hex(obj)
Zubair Khalid
sumber