Saya memiliki ABC123EFFF.
Saya ingin memiliki 001010101111000001001000111110111111111111 (mis. Repr biner dengan, katakanlah, 42 digit dan nol di depan).
Bagaimana?
Untuk menyelesaikan soal sisi kiri tanpa jejak:
my_hexdata = "1a"
scale = 16 ## equals to hexadecimal
num_of_bits = 8
bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)
Ini akan memberikan 00011010 bukan versi yang dipangkas.
len(my_hexdata) * log2(scale)
.Baca
binascii.unhexlify
Kembalikan data biner yang diwakili oleh string heksadesimal yang ditentukan sebagai parameter.
sumber
sumber
Jawaban singkat:
F-string baru di Python 3.6 memungkinkan Anda melakukan ini menggunakan sintaks yang sangat singkat:
atau untuk memecahnya dengan semantik:
Jawaban panjang:
Apa yang sebenarnya Anda katakan adalah bahwa Anda memiliki nilai dalam representasi heksadesimal, dan Anda ingin merepresentasikan nilai yang setara dalam biner.
Nilai kesetaraan adalah bilangan bulat. Tapi Anda bisa mulai dengan string, dan untuk melihat dalam biner, Anda harus diakhiri dengan string.
Ubah hex menjadi biner, 42 digit dan nol di depan?
Kami memiliki beberapa cara langsung untuk mencapai tujuan ini, tanpa peretasan menggunakan irisan.
Pertama, sebelum kita dapat melakukan manipulasi biner sama sekali, konversikan ke int (saya anggap ini dalam format string, bukan sebagai literal):
alternatifnya kita bisa menggunakan literal integer seperti yang dinyatakan dalam bentuk heksadesimal:
Sekarang kita perlu mengekspresikan integer kita dalam representasi biner.
Gunakan fungsi builtin,
format
Kemudian lolos ke
format
:Ini menggunakan bahasa mini spesifikasi pemformatan .
Untuk menguraikannya, inilah bentuk tata bahasanya:
Untuk membuatnya menjadi spesifikasi untuk kebutuhan kita, kita hanya mengecualikan hal-hal yang tidak kita butuhkan:
dan teruskan itu ke format
String Formatting (Templating) dengan
str.format
Kita bisa menggunakannya dalam string menggunakan
str.format
metode:Atau cukup letakkan spesifikasi langsung di string asli:
Pemformatan String dengan f-string baru
Mari kita peragakan f-string baru. Mereka menggunakan aturan pemformatan bahasa mini yang sama:
Sekarang mari kita letakkan fungsi ini ke dalam fungsi untuk mendorong penggunaan kembali:
Dan sekarang:
Ke samping
Jika Anda sebenarnya hanya ingin menyandikan data sebagai string byte dalam memori atau pada disk, Anda dapat menggunakan
int.to_bytes
metode ini, yang hanya tersedia di Python 3:Dan karena 42 bit dibagi 8 bit per byte sama dengan 6 byte:
sumber
'0b1010101111000001001000111110111111111111'
sumber
sumber
Berikut adalah cara yang cukup mentah untuk melakukannya dengan menggunakan bit fiddling untuk menghasilkan string biner.
Sedikit kunci untuk dipahami adalah:
Yang akan menghasilkan 0 atau 1 jika bit ke-i dari n disetel.
Edit: menggunakan operator ternary "baru" ini:
Akan menjadi:
(TBH mana yang saya tidak yakin seberapa mudah dibaca)
sumber
01111001
11111110
.Ini adalah sedikit sentuhan untuk solusi Glen Maynard, yang menurut saya adalah cara yang tepat untuk melakukannya. Itu hanya menambahkan elemen padding.
Menariknya dari kelas. Keluarkan saja
self,
jika Anda mengerjakan skrip yang berdiri sendiri.sumber
Gunakan Fungsi built-in format () dan fungsi int () Sederhana dan mudah dimengerti. Ini versi jawaban Aaron yang sedikit disederhanakan
int ()
format()
Contoh
Lihat juga jawaban ini
sumber
Ganti setiap digit hex dengan 4 digit biner yang sesuai:
sumber
hex -> desimal lalu desimal -> biner
sumber
Cara lain:
sumber
Saya menambahkan kalkulasi jumlah bit yang harus diisi ke solusi Onedinkenedi. Inilah fungsi yang dihasilkan:
Di mana 16 adalah basis tempat Anda mengonversi (heksadesimal), dan 4 adalah berapa banyak bit yang Anda butuhkan untuk mewakili setiap digit, atau log basis 2 dari skala.
sumber
sumber
Saya memiliki harapan terpotong pendek yang membantu :-)
pertama saya menggunakan masukan Anda dan menghitungnya untuk mendapatkan setiap simbol. kemudian saya mengubahnya menjadi biner dan memangkas dari posisi ke-3 sampai akhir. Trik untuk mendapatkan 0 adalah dengan menambahkan nilai maksimal dari input -> dalam hal ini selalu 16 :-)
bentuk singkatnya adalah metode bergabung. Nikmati.
sumber
sumber
Versi biner ABC123EFFF sebenarnya adalah 1010101111000001001000111110111111111111
Untuk hampir semua aplikasi, Anda ingin versi biner memiliki panjang kelipatan 4 dengan bantalan awal 0s.
Untuk mendapatkan ini dengan Python:
Contoh 1:
Contoh 2:
Perhatikan bahwa ini juga berfungsi di Micropython :)
sumber
Hanya menggunakan modul Coden (catatan: Saya penulis modul)
Anda dapat mengonversi haxedecimal ke biner di sana.
Kata kunci yang mengubah adalah:
Jadi Anda juga bisa memformat: e. hexadecimal_output = bin_to_hex (bilangan_biner)
sumber
HEX_TO_BINARY_CONVERSION_TABLE = {'0': '0000',
sumber
sumber
sumber
sumber