Коротка відповідь
Вам потрібно натиснути на bytes-like
об'єкт ( bytes
, bytearray
, і т.д.) до base64.b64encode()
методу. Ось два способи:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Або зі змінною:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Чому?
У Python 3 str
об'єкти - це не масиви символів у стилі C (тому вони не є байтовими масивами), а, скоріше, це структури даних, які не мають притаманного кодування. Ви можете кодувати цей рядок (або інтерпретувати його) різними способами. Найпоширеніший (і за замовчуванням у Python 3) - utf-8, тим більше, що він сумісний з ASCII (хоча, як і найбільш широко використовувані кодування). Ось що відбувається, коли ви приймаєте a string
і викликаєте .encode()
метод на ньому: Python інтерпретує рядок у utf-8 (кодування за замовчуванням) і надає вам масив байтів, якому він відповідає.
Кодування Base-64 в Python 3
Спочатку заголовок питання задавали про кодування Base-64. Читайте далі про матеріали Base-64.
base64
кодування займає 6-бітні двійкові фрагменти та кодує їх за допомогою символів AZ, az, 0-9, '+', '/' та '=' (деякі кодування використовують різні символи замість '+' та '/') . Це кодування символів, яке базується на математичній конструкції системи числення radix-64 або base-64, але вони сильно відрізняються. Base-64 з математики - це система числення, подібна до двійкової чи десяткової, і ви змінюєте радіацію на ціле число, або (якщо радіус, з якого перетворюєте, - потужність на 2 менше 64) в кусах справа на зліва.
При base64
кодуванні переклад робиться зліва направо; ці перші 64 символи, тому його називають base64
кодуванням . 65-й символ "=" використовується для заміщення, оскільки кодування тягне 6-бітні шматки, але дані, які зазвичай мають кодувати, - це 8-бітні байти, тому іноді в останньому фрагменті є лише два або 4 біта.
Приклад:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
Якщо ви інтерпретуєте ці двійкові дані як єдине ціле число, то саме так ви перетворили б їх у base-10 та base-64 ( таблиця для base-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
кодування , однак, перегрупує ці дані таким чином:
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
Отже, "B0ZXN0" є базовою версією 64 нашої бінарної, математично кажучи. Однак base64
кодування має виконувати кодування у зворотному напрямку (тому необроблені дані перетворюються на 'dGVzdA'), а також є правило повідомляти іншим програмам, скільки місця залишилося в кінці. Це робиться шляхом прокладки кінця символами '='. Отже, base64
кодування цих даних - 'dGVzdA ==', з двома символами '=' для позначення двох пар біт потрібно буде видалити з кінця, коли ці дані будуть декодовані, щоб вони відповідали вихідним даним.
Давайте перевіримо це, щоб побачити, чи я нечесний:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
Навіщо використовувати base64
кодування?
Скажімо, я маю надсилати деякі дані комусь по електронній пошті, як ці дані:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
Я посадив дві проблеми:
- Якщо я спробував надіслати цей електронний лист в Unix, він надішле, як тільки
\x04
символ буде прочитаний, оскільки це ASCII для END-OF-TRANSMISSION
(Ctrl-D), тож решта даних залишиться поза передачею.
- Крім того, хоча Python досить розумний, щоб уникнути всіх моїх злих контрольних символів, коли я друкую дані безпосередньо, коли ця рядок розшифровується як ASCII, ви можете бачити, що "msg" немає. Це тому, що я використав три
BACKSPACE
символи та три SPACE
символи, щоб стерти 'msg'. Таким чином, навіть якби у мене не було EOF
символу, кінцевий користувач не зміг би перевести з тексту на екрані справжні, необроблені дані.
Це просто демонстрація, щоб показати вам, як важко просто надсилати необроблені дані. Кодування даних у формат base64 дає вам такі самі дані, але у форматі, який забезпечує безпеку для надсилання електронних носіїв інформації, таких як електронна пошта.