Mengikuti contoh python ini , saya menyandikan string sebagai Base64 dengan:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Tapi, jika saya tinggalkan pemimpin b
:
>>> encoded = base64.b64encode('data to be encoded')
Saya mendapatkan kesalahan berikut:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python32\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
Kenapa ini?
python
python-3.x
base64
dublintech
sumber
sumber
Jawaban:
base64 encoding mengambil 8-bit byte data dan mengkodekan itu hanya menggunakan karakter
A-Z
,a-z
,0-9
,+
,/
* sehingga dapat ditransmisikan melalui saluran yang tidak melestarikan semua 8-bit data, seperti email.Oleh karena itu, ia ingin string byte 8-bit. Anda membuatnya di Python 3 dengan
b''
sintaks.Jika Anda menghapus
b
, itu menjadi string. String adalah urutan karakter Unicode. base64 tidak tahu apa yang harus dilakukan dengan data Unicode, ini bukan 8-bit. Sebenarnya tidak sedikit pun. :-)Dalam contoh kedua Anda:
Semua karakter cocok dengan rapi ke set karakter ASCII, dan oleh karena itu pengkodean base64 agak tidak ada gunanya. Anda dapat mengubahnya menjadi ascii sebagai gantinya, dengan
Atau lebih sederhana:
Yang akan menjadi hal yang sama dalam hal ini.
* Sebagian besar rasa base64 juga bisa termasuk a
=
di akhir sebagai padding. Selain itu, beberapa varian base64 dapat menggunakan karakter selain+
dan/
. Lihat tabel ringkasan Varian di Wikipedia untuk ikhtisar.sumber
Jawaban singkat
Anda perlu untuk mendorong
bytes-like
objek (bytes
,bytearray
, dll) kebase64.b64encode()
metode. Berikut ini dua cara:Atau dengan variabel:
Mengapa?
Dalam Python 3,
str
objek bukan array karakter C-style (jadi mereka bukan byte array), melainkan, mereka adalah struktur data yang tidak memiliki pengkodean yang melekat. Anda dapat menyandikan string itu (atau menafsirkannya) dengan berbagai cara. Yang paling umum (dan default dalam Python 3) adalah utf-8, terutama karena itu kompatibel dengan ASCII (meskipun, seperti pengkodean yang paling banyak digunakan). Itulah yang terjadi ketika Anda mengambilstring
dan memanggil.encode()
metode di atasnya: Python menafsirkan string dalam utf-8 (pengodean default) dan memberikan Anda array byte yang sesuai dengan itu.Pengodean Basis-64 dengan Python 3
Awalnya judul pertanyaan bertanya tentang pengkodean Base-64. Baca terus untuk hal-hal Base-64.
base64
Pengkodean mengambil potongan biner 6-bit dan mengkodekannya menggunakan karakter AZ, az, 0-9, '+', '/', dan '=' (beberapa pengkodean menggunakan karakter yang berbeda di tempat '+' dan '/') . Ini adalah pengkodean karakter yang didasarkan pada konstruksi matematika dari sistem nomor radix-64 atau base-64, tetapi mereka sangat berbeda. Basis-64 dalam matematika adalah sistem bilangan seperti biner atau desimal, dan Anda melakukan perubahan radix ini pada seluruh bilangan, atau (jika radix yang Anda konversi adalah kekuatan 2 kurang dari 64) dalam potongan dari kanan ke kiri.Dalam
base64
encoding, terjemahan dilakukan dari kiri ke kanan; 64 karakter pertama itulah mengapa disebutbase64
encoding . Simbol '=' ke-65 digunakan untuk melapisi, karena penyandian menarik potongan 6-bit tetapi data yang biasanya dimaksudkan untuk disandikan adalah byte 8-bit, jadi kadang-kadang hanya ada dua atau 4 bit di chunk terakhir.Contoh:
Jika Anda menginterpretasikan data biner itu sebagai bilangan bulat tunggal, maka ini adalah bagaimana Anda akan mengubahnya menjadi basis-10 dan basis-64 ( tabel untuk basis-64 ):
base64
pengkodean , bagaimanapun, akan mengelompokkan kembali data ini sebagai berikut:Jadi, 'B0ZXN0' adalah versi basis-64 dari biner kami, secara matematis. Namun,
base64
pengkodean harus melakukan pengkodean dalam arah yang berlawanan (sehingga data mentah dikonversi ke 'dGVzdA') dan juga memiliki aturan untuk memberi tahu aplikasi lain berapa banyak ruang yang tersisa pada akhirnya. Ini dilakukan dengan melapisi bagian akhir dengan simbol '='. Jadi,base64
pengkodean data ini adalah 'dGVzdA ==', dengan dua simbol '=' untuk menandakan dua pasang bit harus dihapus dari bagian akhir ketika data ini di-decode untuk membuatnya cocok dengan data asli.Mari kita uji ini untuk melihat apakah saya tidak jujur:
Mengapa menggunakan
base64
encoding?Katakanlah saya harus mengirim beberapa data ke seseorang melalui email, seperti data ini:
Ada dua masalah yang saya tanam:
\x04
karakter dibaca, karena itu adalah ASCII untukEND-OF-TRANSMISSION
(Ctrl-D), sehingga data yang tersisa akan ditinggalkan dari transmisi.BACKSPACE
karakter dan tigaSPACE
karakter untuk menghapus 'msg'. Jadi, bahkan jika saya tidak memilikiEOF
karakter di sana, pengguna akhir tidak akan dapat menerjemahkan dari teks di layar ke data mentah yang asli.Ini hanya demo untuk menunjukkan betapa sulitnya mengirim data mentah. Pengkodean data ke dalam format base64 memberi Anda data yang sama persis tetapi dalam format yang memastikan aman untuk mengirim melalui media elektronik seperti email.
sumber
base64.b64encode(s.encode()).decode()
tidak terlalu pythonic ketika semua yang Anda inginkan adalah string ke string konversi.base64.encode(s)
harus cukup setidaknya di python3. Terima kasih atas penjelasan yang sangat baik tentang string dan byte dalam pythonbase64.encode(s)
tidak akan bekerja di Python3; apakah Anda mengatakan bahwa sesuatu seperti itu harus tersedia? Saya pikir alasannya mungkin membingungkan adalah bahwa, tergantung pada pengkodean dan isi string,s
mungkin tidak memiliki 1 representasi unik sebagai array byte.Jika data yang akan dikodekan berisi karakter "eksotis", saya pikir Anda harus menyandikan dalam "UTF-8"
sumber
Jika string adalah Unicode, cara termudah adalah:
sumber
Yang Anda butuhkan:
Yang terdepan
b
membuat string biner Anda.Versi Python apa yang Anda gunakan? 2.x atau 3.x?
Sunting: Lihat http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit untuk detail berdarah string di Python 3.x
sumber
Itu berarti Anda mengambil input sebagai byte atau byte array bukan sebagai string.
sumber