Jawaban singkat
Anda perlu untuk mendorong bytes-like
objek ( bytes
, bytearray
, dll) ke base64.b64encode()
metode. Berikut ini dua cara:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Atau dengan variabel:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
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 mengambil string
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 disebut base64
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:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
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 ):
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
pengkodean , bagaimanapun, akan mengelompokkan kembali data ini sebagai berikut:
base-2: 011101 000110 010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10: 29 6 21 51 29 0
base-64: d G V z d A
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:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
Mengapa menggunakan base64
encoding?
Katakanlah saya harus mengirim beberapa data ke seseorang melalui email, seperti data ini:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
Ada dua masalah yang saya tanam:
- Jika saya mencoba mengirim email itu di Unix, email itu akan dikirimkan segera setelah
\x04
karakter dibaca, karena itu adalah ASCII untuk END-OF-TRANSMISSION
(Ctrl-D), sehingga data yang tersisa akan ditinggalkan dari transmisi.
- Juga, sementara Python cukup pintar untuk keluar dari semua karakter kontrol jahat saya ketika saya mencetak data secara langsung, ketika string itu diterjemahkan sebagai ASCII, Anda dapat melihat bahwa 'msg' tidak ada di sana. Itu karena saya menggunakan tiga
BACKSPACE
karakter dan tiga SPACE
karakter untuk menghapus 'msg'. Jadi, bahkan jika saya tidak memiliki EOF
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.