Kısa cevap
Bir itmek için gereken bytes-like
nesne ( bytes
, bytearray
için, vs) base64.b64encode()
yöntemiyle. İşte iki yol:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Veya bir değişkenle:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Neden?
Python 3'te, str
nesneler C tarzı karakter dizileri değildir (bu nedenle bayt dizileri değildir ), aksine, herhangi bir doğal kodlaması olmayan veri yapılarıdır. Bu dizeyi çeşitli şekillerde kodlayabilirsiniz (veya yorumlayabilirsiniz). En yaygın (ve Python 3'te varsayılan), özellikle ASCII ile geriye dönük olarak uyumlu olduğu için (en yaygın kullanılan kodlamalar gibi) utf-8'dir. Bunu alıp yöntemini string
çağırdığınızda olan .encode()
şey budur: Python, dizeyi utf-8'de (varsayılan kodlama) yorumlar ve karşılık gelen bayt dizisini sağlar.
Python 3'te Base-64 Kodlama
Başlangıçta soru başlığı Base-64 kodlaması hakkında sorular sordu. Base-64 işleri için okumaya devam edin.
base64
kodlama 6 bitlik ikili parçaları alır ve AZ, az, 0-9, '+', '/' ve '=' karakterlerini kullanarak kodlar (bazı kodlamalar '+' ve '/' yerine farklı karakterler kullanır) . Bu, radix-64 veya base-64 sayı sisteminin matematiksel yapısına dayanan bir karakter kodlamasıdır, ancak bunlar çok farklıdır. Matematikteki Base-64, ikili veya ondalık gibi bir sayı sistemidir ve bu sayıdaki tüm sayıdaki yarıçap değişikliğini veya (dönüştürdüğünüz yarıçap 64'ten az bir güçse) sağdan ayrıldı.
In base64
kodlama, çeviri soldan sağa doğru yapılır; bu ilk 64 karakter neden base64
kodlama olarak adlandırılır . 65 '=' sembolü dolgu için kullanılır, çünkü kodlama 6 bitlik parçalar çeker, ancak genellikle kodlaması amaçlanan veriler 8 bit bayttır, bu nedenle bazen son yığında sadece iki veya 4 bit vardır.
Misal:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
Bu ikili verileri tek bir tamsayı olarak yorumlarsanız, bu şekilde base-10 ve base-64'e dönüştürürsünüz ( base-64 için tablo ):
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
Ancak kodlama bu verileri bu şekilde yeniden gruplandıracaktır:
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
Yani, 'B0ZXN0' ikili, matematiksel olarak konuşulan temel-64 sürümüdür. Bununla birlikte, base64
kodlamanın kodlamayı ters yönde yapması gerekir (böylece ham veriler 'dGVzdA'ya dönüştürülür) ve ayrıca diğer uygulamalara sonunda ne kadar alan kaldığını söylemek için bir kuralı vardır. Bu, ucu '=' sembolleriyle doldurarak yapılır. Bu nedenle, base64
bu verilerin kodlanması 'dGVzdA ==', iki 'bit' sembolünü gösteren iki '=' sembolü ile bu verilerin orijinal verilerle eşleşmesi için kod çözüldüğünde sondan çıkarılması gerekecektir.
Dürüst olup olmadığımı görmek için bunu test edelim:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
Neden base64
kodlama kullanılır?
Diyelim ki, bu veriler gibi birisine e-posta yoluyla bazı veriler göndermek zorundayım:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
Diktiğim iki sorun var:
- Bu e-postayı Unix'te göndermeye çalışırsam,
\x04
karakter okunduğunda e-posta gönderilir , çünkü bu END-OF-TRANSMISSION
(Ctrl-D) için ASCII olduğundan geri kalan veriler iletimin dışında bırakılır.
- Ayrıca, verileri doğrudan yazdırdığımda Python tüm kötü kontrol karakterlerimden kaçacak kadar akıllı olsa da, bu dize ASCII olarak çözüldüğünde, 'msg'nin orada olmadığını görebilirsiniz. Çünkü 'msg'yi silmek için üç
BACKSPACE
karakter ve üç SPACE
karakter kullandım. Böylece, EOF
orada karakter olmasa bile , son kullanıcı ekrandaki metinden gerçek, ham verilere çeviremezdi.
Bu sadece ham veri göndermenin ne kadar zor olabileceğini gösteren bir demodur. Verilerin base64 biçimine kodlanması size tam olarak aynı verileri verir, ancak e-posta gibi elektronik ortamlar üzerinden gönderilmesini güvenli bir biçimde sağlar.