Рубрики
Без рубрики

Кодирование и декодирование строк Base64 в Python

Кодировка Base64 позволяет нам преобразовывать байты, содержащие двоичные или текстовые данные, в символы ASCII. В этом уроке мы будем кодировать и декодировать строки Base64 в Python.

Автор оригинала: Abhishek Amin.

Кодирование и декодирование строк Base64 в Python

Вступление

Вы когда-нибудь получали PDF-файл или файл изображения от кого-то по электронной почте только для того, чтобы увидеть странные символы, когда вы открываете его? Это может произойти, если ваш почтовый сервер был предназначен только для обработки текстовых данных. Файлы с двоичными данными, байтами, которые представляют нетекстовую информацию, такую как изображения, могут быть легко повреждены при передаче и обработке в текстовые системы.

Кодировка Base64 позволяет нам преобразовывать байты, содержащие двоичные или текстовые данные, в символы ASCII . Кодируя наши данные, мы повышаем вероятность их правильной обработки различными системами.

В этом уроке мы узнаем, как работает кодирование и декодирование Base64 и как его можно использовать. Затем мы будем использовать Python для кодирования и декодирования Base64 как текстовых, так и двоичных данных.

  • Что Такое Кодировка Base64?
  • Как Работает Кодировка Base64?
  • Зачем Использовать Кодировку Base64?
  • Кодирование строк с помощью Python
  • Декодирование строк с помощью Python
  • Кодирование двоичных данных с помощью Python
  • Декодирование двоичных данных с помощью Python
  • Вывод

Что такое кодировка Base64?

Кодировка Base64-это тип преобразования байтов в символы ASCII. В математике основа системы счисления относится к тому, сколько различных символов представляют числа. Название этой кодировки происходит непосредственно от математического определения базисов – у нас есть 64 символа, которые представляют числа.

Набор символов Base64 содержит:

  • 26 заглавных букв
  • 26 строчных букв
  • 10 чисел
  • + и / для новых строк (некоторые реализации могут использовать разные символы)

Когда компьютер преобразует символы Base64 в двоичные, каждый символ Base64 представляет 6 бит информации.

Примечание: Это не алгоритм шифрования, и его не следует использовать в целях безопасности.

Теперь, когда мы знаем, что такое кодировка Base64 и как она представлена на компьютере, давайте посмотрим глубже, как она работает.

Как Работает Кодировка Base64?

Мы проиллюстрируем, как работает кодировка Base64 путем преобразования текстовых данных, поскольку она более стандартна, чем различные двоичные форматы на выбор. Если бы мы должны были Base64 кодировать строку мы бы выполнили следующие действия:

  1. Возьмите значение ASCII каждого символа в строке
  2. Вычислите 8-битный двоичный эквивалент значений ASCII
  3. Преобразуйте 8-битные фрагменты в фрагменты по 6 бит, просто перегруппировав цифры
  4. Преобразуйте 6-битные двоичные группы в соответствующие им десятичные значения.
  5. Используя таблицу кодирования base64, назначьте соответствующий символ base64 для каждого десятичного значения.

Давайте посмотрим, как это работает, преобразовав строку “Python” в строку Base64.

Значения ASCII символов P, y, t, h, o, n являются 15, 50, 45, 33, 40, 39 соответственно. Мы можем представить эти значения ASCII в 8-битном двоичном формате следующим образом:

01010000 01111001 01110100 01101000 01101111 01101110

Напомним, что символы Base64 представляют только 6 бит данных. Теперь мы перегруппируем 8-битные двоичные последовательности в блоки по 6 бит. Результирующий двоичный файл будет выглядеть следующим образом:

010100 000111 100101 110100 011010 000110 111101 101110

Примечание: Иногда мы не можем сгруппировать данные в последовательности по 6 бит. Если это произойдет, мы должны дополнить последовательность .

С нашими данными в группах по 6 бит мы можем получить десятичное значение для каждой группы. Используя наш последний результат, мы получаем следующие десятичные значения:

20 7 37 52 26 6 61 46

Наконец, мы преобразуем эти десятичные дроби в соответствующий символ Base64 с помощью таблицы преобразования Base64:

Таблица кодирования Base64

Как видите, значение 20 соответствует букве U . Затем мы смотрим на 7 и обратите внимание, что он сопоставлен с H . Продолжая этот поиск для всех десятичных значений, мы можем определить, что “Python” представлен как UHl0aG9u при кодировке Base64. Вы можете проверить этот результат с помощью онлайн-конвертера.

Чтобы кодировать строку Base64, мы преобразуем ее в двоичные последовательности, затем в десятичные последовательности и, наконец, используем таблицу поиска, чтобы получить строку символов ASCII. С этим более глубоким пониманием того, как это работает, давайте посмотрим, почему мы должны кодировать наши данные Base64.

Зачем использовать кодировку Base64?

В компьютерах все данные различных типов передаются как 1s и 0s. Однако некоторые каналы связи и приложения не в состоянии понять все биты, которые он получает. Это происходит потому, что значение последовательности 1 и 0 зависит от типа данных, которые она представляет. Например, 10110001 должен быть обработан по-другому, если он представляет собой букву или изображение.

Чтобы обойти это ограничение, вы можете кодировать свои данные в текст, повышая вероятность их правильной передачи и обработки. Base64-это популярный метод преобразования двоичных данных в символы ASCII, который широко используется большинством сетей и приложений.

Распространенный реальный сценарий, в котором кодировка Base64 широко используется,-это почтовые серверы. Изначально они были созданы для обработки текстовых данных, но мы также ожидаем, что они будут отправлять изображения и другие носители с сообщением. В этих случаях ваши медиаданные будут закодированы в Base64 при отправке. Затем он будет декодирован Base64, когда будет получен, чтобы приложение могло его использовать. Так, например, изображение в HTML может выглядеть следующим образом:


Понимая, что данные иногда нужно отправлять в виде текста, чтобы они не были повреждены, давайте посмотрим, как мы можем использовать Python для кодирования и декодирования данных Base64.

Кодирование строк с помощью Python

Python 3 предоставляет модуль base64 , который позволяет нам легко кодировать и декодировать информацию. Сначала мы преобразуем строку в байтоподобный объект. После преобразования мы можем использовать модуль base64 для его кодирования.

В новом файле encoding_text.py , введите следующее:

import base64

message = "Python is fun"
message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')

print(base64_message)

В приведенном выше коде мы сначала импортировали модуль base64 . Переменная message хранит нашу входную строку для кодирования. Мы преобразуем его в байтоподобный объект, используя метод строки encode , и сохраняем его в message_bytes . Затем мы кодируем Base64 message_bytes и сохраняем результат в base64_bytes с помощью метода base64.b64encode . Наконец, мы получаем строковое представление преобразования Base64, декодируя base64_bytes как ASCII.

Примечание: Обязательно используйте тот же формат кодировки, что и при преобразовании из строки в байт, и из байта в строку. Это предотвращает повреждение данных.

Запуск этого файла приведет к следующему результату:

$ python3 encoding_text.py
UHl0aG9uIGlzIGZ1bg==

Теперь давайте посмотрим, как мы можем декодировать строку Base64 в ее необработанное представление.

Декодирование строк с помощью Python

Декодирование строки Base64, по сути, является обратным процессом кодирования. Мы декодируем строку Base64 в байты некодированных данных. Затем мы преобразуем байтоподобный объект в строку.

В новом файле под названием decoding_text.py , напишите следующий код:

import base64

base64_message = 'UHl0aG9uIGlzIGZ1bg=='
base64_bytes = base64_message.encode('ascii')
message_bytes = base64.b64decode(base64_bytes)
message = message_bytes.decode('ascii')

print(message)

Опять же, нам нужен импортированный модуль base64 . Затем мы кодируем наше сообщение в байтоподобный объект с помощью encode('ASCII') . Мы продолжаем вызывать метод base64.b64decode для декодирования base64_bytes в нашу переменную message_bytes . Наконец, мы декодируем message_bytes в строковый объект message , чтобы он стал читаемым человеком.

Запустите этот файл, чтобы увидеть следующие выходные данные:

$ python3 decoding_text.py
Python is fun

Теперь, когда мы можем кодировать и декодировать строковые данные, давайте попробуем кодировать двоичные данные.

Кодирование двоичных данных с помощью Python

Как мы уже упоминали ранее, кодировка Base64 в основном используется для представления двоичных данных в виде текста. В Python нам нужно прочитать двоичный файл, а Base64 кодирует его байты, чтобы мы могли сгенерировать его кодированную строку.

Давайте посмотрим, как мы можем закодировать этот образ:

Логотип Python

Создайте новый файл encoding_binary.py и добавить следующее:

import base64

with open('logo.png', 'rb') as binary_file:
    binary_file_data = binary_file.read()
    base64_encoded_data = base64.b64encode(binary_file_data)
    base64_message = base64_encoded_data.decode('utf-8')

    print(base64_message)

Давайте рассмотрим приведенный выше фрагмент кода. Открываем файл с помощью open('my_image.png', 'rb') . Обратите внимание, как мы передали аргумент 'rb' вместе с путем к файлу – это говорит Python, что мы читаем двоичный файл. Без использования 'rb' Python предположил бы , что мы читаем текстовый файл.

Затем мы используем метод read () , чтобы получить все данные в файле в переменную binary_file_data . Аналогично тому, как мы обрабатывали строки, мы Base64 кодировали байты с помощью base64.b64encode , а затем использовали decode('utf-8') on base64_encoded_data , чтобы получить кодированные Base64 данные с помощью удобочитаемых символов.

Выполнение кода приведет к получению аналогичного результата:

$ python3 encoding_binary.py
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokXLxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aSv92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiKMVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JVPS+6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbliTB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIaxsmHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8Br5eXCsT/w/EAAAAASUVORK5CYII=

Ваши выходные данные могут варьироваться в зависимости от изображения, которое вы выбрали для кодирования.

Теперь, когда мы знаем, как Bas64 кодирует двоичные данные в Python, давайте перейдем к декодированию двоичных данных Base64.

Декодирование двоичных данных с помощью Python

Двоичное декодирование Base64 аналогично декодированию текстовых данных Base64. Ключевое отличие заключается в том, что после того, как мы декодируем строку Base64, мы сохраняем данные в виде двоичного файла, а не строки.

Давайте посмотрим, как Base64 декодирует двоичные данные на практике, создавая новый файл с именем decoding_binary.py . Введите следующий код в файл Python:

import base64

base64_img = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAA' \
            'LEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokX' \
            'LxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aS' \
            'v92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj' \
            '9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiK' \
            'MVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JVPS+' \
            '6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbli' \
            'TB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D' \
            '6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2' \
            'PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIax' \
            'smHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8' \
            'Br5eXCsT/w/EAAAAASUVORK5CYII='

base64_img_bytes = base64_img.encode('utf-8')
with open('decoded_image.png', 'wb') as file_to_save:
    decoded_image_data = base64.decodebytes(base64_img_bytes)
    file_to_save.write(decoded_image_data)

В приведенном выше коде мы сначала преобразуем наши строковые данные Base64 в байтоподобный объект, который можно декодировать. Когда вы декодируете двоичный файл base64, вы должны знать тип данных, которые декодируются . Например, эти данные действительны только в виде PNG-файла, а не MP3-файла, поскольку они кодируют изображение.

Как только файл назначения открыт, мы Base64 декодируем данные с помощью base64.decodebytes , отличного метода от base64.b64decode , который использовался со строками. Этот метод следует использовать для декодирования двоичных данных. Наконец, мы записываем декодированные данные в файл.

В том же каталоге, который вы выполнили decoding_binary.py , теперь вы должны увидеть новый файл decoded_image.png , содержащий исходное изображение, которое было закодировано ранее.

Вывод

Кодирование Base64-это популярный метод преобразования данных в различных двоичных форматах в строку символов ASCII. Это полезно при передаче данных в сети или приложения, которые не могут обрабатывать необработанные двоичные данные, но легко обрабатывают текст.

С помощью Python мы можем использовать модуль base64 для кодирования и декодирования текстовых и двоичных данных Base64.

Какие приложения вы бы использовали для кодирования и декодирования данных Base64?