Secara spesifik, apa yang Anda harapkan dari keluaran?
NPE
Yang Anda maksud dengan "biner" adalah jenis 0101010 atau ordnomor akhir dari setiap karakter dalam (misalnya hex)?
cdarke
Dengan asumsi bahwa yang Anda maksud adalah biner (nol dan satu), apakah Anda menginginkan representasi biner dari setiap karakter (8 bit per karakter) satu demi satu? misalnya h adalah ascii nilai 104 akan menjadi 01101000 dalam biner
Atau jika Anda ingin setiap bilangan biner menjadi 1 byte: ".join (format (ord (i), 'b'). Zfill (8) for i in st)
ChrisProsser
5
Untuk byte penuh Anda juga dapat menggunakan ' '.join('{0:08b}'.format(ord(x), 'b') for x in st), yaitu sekitar 35% lebih cepat daripada zfill(8)solusi (setidaknya di mesin saya).
maks
Bagaimana dengan mengubah karakter lebih dari satu byte, seperti β, misalnya, yang menurut saya direpresentasikan secara 11001110 10110010internal?
Sergey Bushmanov
1
Saya tahu ini sudah lama diposting, tapi bagaimana dengan karakter non-ASCII?
pkqxdd
48
Sebagai cara yang lebih pythonic, pertama-tama Anda dapat mengubah string Anda menjadi array byte kemudian menggunakan binfungsi di dalam map:
>>> st ="hello world">>> map(bin,bytearray(st))['0b1101000','0b1100101','0b1101100','0b1101100','0b1101111','0b100000','0b1110111','0b1101111','0b1110010','0b1101100','0b1100100']
hexlifymengembalikan representasi heksadesimal dari data biner kemudian Anda dapat mengonversinya ke int dengan menetapkan 16 sebagai basisnya kemudian mengubahnya menjadi biner dengan bin.
Tidak hanya ini lebih pythonic, tetapi ini "lebih" benar untuk string non-ASCII multi-byte.
Sergey Bushmanov
Hanya untuk dicatat bahwa (setidaknya untuk versi saat ini 3.7.4): (1) bytearraymengharapkan encoding (bukan hanya string) dan (2) map(bin, ...)akan mengembalikan mapobjek. Untuk poin pertama, saya menggunakan misalnya bob.encoding ('ascii') `seperti yang disarankan oleh @Tao. Untuk yang kedua, titik, menggunakan joinmetode, seperti pada contoh lain dari @Kasramvd akan menampilkan hasil yang diinginkan.
Bagi saya ( v3.7.4), ini mengembalikan bytesobjek (dengan representasi ascii dari setiap byte, jika tersedia), dan untuk menampilkan representasi binernya, saya perlu bin, misalnya dengan ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))(catatan yang 0bperlu dihapus di awal representasi biner dari setiap karakter).
Antoine
15
Anda dapat mengakses nilai kode untuk karakter dalam string Anda menggunakan ord()fungsi bawaan. Jika Anda kemudian perlu memformat ini dalam biner, string.format()metode ini akan melakukan pekerjaan itu.
a ="test"print(' '.join(format(ord(x),'b')for x in a))
(Terima kasih kepada Ashwini Chaudhary untuk memposting cuplikan kode itu.)
Meskipun kode di atas berfungsi dengan Python 3, masalah ini menjadi lebih rumit jika Anda mengasumsikan pengkodean apa pun selain UTF-8. Di Python 2, string adalah urutan byte, dan pengkodean ASCII diasumsikan secara default. Dalam Python 3, string diasumsikan sebagai Unicode, dan ada bytestipe terpisah yang bertindak lebih seperti string Python 2. Jika Anda ingin mengasumsikan pengkodean apa pun selain UTF-8, Anda harus menentukan pengkodeannya.
Dengan Python 3, Anda dapat melakukan sesuatu seperti ini:
a ="test"
a_bytes = bytes(a,"ascii")print(' '.join(["{0:b}".format(x)for x in a_bytes]))
Perbedaan antara pengkodean UTF-8 dan ascii tidak akan terlihat jelas untuk string alfanumerik sederhana, tetapi akan menjadi penting jika Anda memproses teks yang menyertakan karakter yang tidak ada dalam kumpulan karakter ascii.
Dalam Python versi 3.6 dan yang lebih baru, Anda dapat menggunakan f-string untuk memformat hasil.
str ="hello world"print(" ".join(f"{ord(i):08b}"for i in str))0110100001100101011011000110110001101111001000000111011101101111011100100110110001100100
Sisi kiri titik dua, ord (i), adalah objek sebenarnya yang nilainya akan diformat dan dimasukkan ke dalam keluaran. Menggunakan ord () memberi Anda titik kode basis 10 untuk karakter str tunggal.
Sisi kanan titik dua adalah penentu format. 08 artinya lebar 8, 0 empuk, dan b berfungsi sebagai tanda untuk mengeluarkan bilangan yang dihasilkan dalam basis 2 (biner).
Ini adalah pembaruan untuk jawaban yang sudah ada yang digunakan bytearray()dan tidak bisa berfungsi seperti itu lagi:
>>> st ="hello world">>> map(bin, bytearray(st))Traceback(most recent call last):File"<stdin>", line 1,in<module>TypeError: string argument without an encoding
Karena seperti yang dijelaskan pada link di atas, jika source-nya berupa string, Anda juga harus memberikan encodingnya :
>>> map(bin, bytearray(st, encoding='utf-8'))<map object at 0x7f14dfb1ff28>
def method_a(sample_string):
binary =' '.join(format(ord(x),'b')for x in sample_string)def method_b(sample_string):
binary =' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))if __name__ =='__main__':from timeit import timeit
sample_string ='Convert this ascii strong to binary.'print(
timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b'))# 9.564299999998184 2.943955828988692
method_b secara substansial lebih efisien dalam mengonversi ke array byte karena itu membuat panggilan fungsi tingkat rendah daripada secara manual mengubah setiap karakter menjadi integer, dan kemudian mengubah integer itu menjadi nilai binernya.
Apakah Anda ingin menambah jawaban hanya kode yang tidak terbaca ini dengan beberapa penjelasan? Itu akan membantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis. Jika Anda ingin meningkatkan keterbacaan, coba info yang disediakan di sini: stackoverflow.com/editing-help
ord
nomor akhir dari setiap karakter dalam (misalnya hex)?Jawaban:
Sesuatu seperti ini?
sumber
' '.join('{0:08b}'.format(ord(x), 'b') for x in st)
, yaitu sekitar 35% lebih cepat daripadazfill(8)
solusi (setidaknya di mesin saya).β
, misalnya, yang menurut saya direpresentasikan secara11001110 10110010
internal?Sebagai cara yang lebih pythonic, pertama-tama Anda dapat mengubah string Anda menjadi array byte kemudian menggunakan
bin
fungsi di dalammap
:Atau Anda bisa bergabung:
Perhatikan bahwa di python3 Anda perlu menentukan pengkodean untuk
bytearray
fungsi:Anda juga dapat menggunakan
binascii
modul di python 2:hexlify
mengembalikan representasi heksadesimal dari data biner kemudian Anda dapat mengonversinya ke int dengan menetapkan 16 sebagai basisnya kemudian mengubahnya menjadi biner denganbin
.sumber
3.7.4
): (1)bytearray
mengharapkan encoding (bukan hanya string) dan (2)map(bin, ...)
akan mengembalikanmap
objek. Untuk poin pertama, saya menggunakan misalnyabob
.encoding ('ascii') `seperti yang disarankan oleh @Tao. Untuk yang kedua, titik, menggunakanjoin
metode, seperti pada contoh lain dari @Kasramvd akan menampilkan hasil yang diinginkan.Kami hanya perlu menyandikannya.
sumber
v3.7.4
), ini mengembalikanbytes
objek (dengan representasi ascii dari setiap byte, jika tersedia), dan untuk menampilkan representasi binernya, saya perlubin
, misalnya dengan' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))
(catatan yang0b
perlu dihapus di awal representasi biner dari setiap karakter).Anda dapat mengakses nilai kode untuk karakter dalam string Anda menggunakan
ord()
fungsi bawaan. Jika Anda kemudian perlu memformat ini dalam biner,string.format()
metode ini akan melakukan pekerjaan itu.(Terima kasih kepada Ashwini Chaudhary untuk memposting cuplikan kode itu.)
Meskipun kode di atas berfungsi dengan Python 3, masalah ini menjadi lebih rumit jika Anda mengasumsikan pengkodean apa pun selain UTF-8. Di Python 2, string adalah urutan byte, dan pengkodean ASCII diasumsikan secara default. Dalam Python 3, string diasumsikan sebagai Unicode, dan ada
bytes
tipe terpisah yang bertindak lebih seperti string Python 2. Jika Anda ingin mengasumsikan pengkodean apa pun selain UTF-8, Anda harus menentukan pengkodeannya.Dengan Python 3, Anda dapat melakukan sesuatu seperti ini:
Perbedaan antara pengkodean UTF-8 dan ascii tidak akan terlihat jelas untuk string alfanumerik sederhana, tetapi akan menjadi penting jika Anda memproses teks yang menyertakan karakter yang tidak ada dalam kumpulan karakter ascii.
sumber
Dalam Python versi 3.6 dan yang lebih baru, Anda dapat menggunakan f-string untuk memformat hasil.
Sisi kiri titik dua, ord (i), adalah objek sebenarnya yang nilainya akan diformat dan dimasukkan ke dalam keluaran. Menggunakan ord () memberi Anda titik kode basis 10 untuk karakter str tunggal.
Sisi kanan titik dua adalah penentu format. 08 artinya lebar 8, 0 empuk, dan b berfungsi sebagai tanda untuk mengeluarkan bilangan yang dihasilkan dalam basis 2 (biner).
sumber
Ini adalah pembaruan untuk jawaban yang sudah ada yang digunakan
bytearray()
dan tidak bisa berfungsi seperti itu lagi:Karena seperti yang dijelaskan pada link di atas, jika source-nya berupa string, Anda juga harus memberikan encodingnya :
sumber
method_b secara substansial lebih efisien dalam mengonversi ke array byte karena itu membuat panggilan fungsi tingkat rendah daripada secara manual mengubah setiap karakter menjadi integer, dan kemudian mengubah integer itu menjadi nilai binernya.
sumber
sumber