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.