Saya memiliki string Hex panjang yang mewakili serangkaian nilai dari berbagai jenis. Saya ingin mengubah String Hex ini menjadi array byte sehingga saya bisa menggeser setiap nilai keluar dan mengubahnya menjadi tipe data yang tepat.
150
Jawaban:
Misalkan string hex Anda adalah sesuatu seperti
Konversikan ke string (Python ≤ 2.7):
atau sejak Python 2.7 dan Python 3.0:
Perhatikan bahwa itu
bytes
adalah versi yang tidak berubah daribytearray
.sumber
string
->bytes
, `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` yang menghasilkanb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Tidak memposting sebagai jawaban karena pertanyaan meminta byte array, tetapi memposting di sini karena itu adalah hit pertama yang saya dapatkan ketika mencari hext ke byte.hex_string.decode("hex")
sedang bekerja pada Python 2.7. Saya baru saja menguji pada sayaPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
melempar kesalahan ketika string input memiliki jumlah karakter ganjil:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.Ada fungsi bawaan di bytearray yang melakukan apa yang Anda inginkan.
Ini mengembalikan bytearray dan membaca string hex dengan atau tanpa pemisah ruang.
sumber
hex_string.decode("hex")
tidak.asalkan saya mengerti dengan benar, Anda harus mencari binascii.unhexlify
sumber
unhexlify
adalah cara paling efisien untuk pergi ke sini, tetapi akan menyarankan itub = bytearray(s)
akan menjadi lebih baik daripada menggunakanord
. Karena Python memiliki tipe bawaan hanya untuk array byte, saya terkejut tidak ada yang menggunakannyaDengan asumsi Anda memiliki string byte seperti itu
"\ x12 \ x45 \ x00 \ xAB"
dan Anda tahu jumlah byte dan tipenya, Anda juga dapat menggunakan pendekatan ini
Seperti yang saya tentukan endian kecil (menggunakan char '<') pada awal string format fungsi mengembalikan setara desimal.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B sama dengan satu byte (8 bit) yang tidak ditandatangani
H sama dengan dua byte (16 bit) yang tidak ditandatangani
Lebih banyak karakter dan ukuran byte yang tersedia dapat ditemukan di sini
Keuntungannya adalah ..
Anda dapat menentukan lebih dari satu byte dan endian nilai
Kekurangan ..
Anda benar-benar perlu mengetahui jenis dan panjang data yang Anda hadapi
sumber
Anda harus bisa membuat string yang menyimpan data biner menggunakan sesuatu seperti:
Ini mungkin bukan cara tercepat (banyak string ditambahkan), tetapi cukup sederhana dengan hanya menggunakan Python inti.
sumber
Anda dapat menggunakan modul Codec di Python Standard Library, yaitu
sumber
sumber
Satu liner yang bagus adalah:
Ini akan mengulangi setiap karakter dalam string dan menjalankannya melalui fungsi ord (). Hanya diuji pada python 2.6, tidak terlalu yakin tentang 3.0+.
Astaga
sumber
byte_list = bytearray(hex_string)