Статьи

Кодирование и декодирование Base64 с использованием Python

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

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

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

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

Base64 — это способ, которым 8-битные двоичные данные кодируются в формате, который может быть представлен в 7 битах. Это делается с использованием только символов AZ , az , 0-9 , + и / для представления данных, с = используется для заполнения данных. Например, используя это кодирование, три 8-битных байта преобразуются в четыре 7-битных байта.

Термин Base64 взят из стандарта Multipurpose Internet Mail Extensions (MIME) , который широко используется для HTTP и XML, и первоначально был разработан для кодирования вложений электронной почты для передачи.

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

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

Кодирование Base64 — это процесс преобразования двоичных данных в ограниченный набор символов из 64 символов. Как показано в первом разделе, это символы AZ , az , 0-9 , + и / (считайте их, вы заметили, что они добавляют до 64?). Этот набор символов считается наиболее распространенным набором символов и называется Base64 MIME. Он использует AZ , az , 0-9 , + и / для первых 62 значений, а также + и / для последних двух значений.

Закодированные в Base64 данные оказываются длиннее исходных данных, так что, как упоминалось выше, на каждые 3 байта двоичных данных имеется по меньшей мере 4 байта закодированных в Base64 данных. Это связано с тем, что мы сжимаем данные в меньший набор символов.

Вы когда-нибудь видели часть необработанного файла электронной почты, подобного показанному ниже (который, скорее всего, происходит из-за того, что письмо не доставлено)? Если так, то вы видели кодировку Base64 в действии! (Если вы заметили «=», вы можете сделать вывод, что это кодировка Base64, поскольку знак равенства используется в процессе кодирования для заполнения).

« `plain Content-Type: text / plain; charset = UTF-8 Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix 2KfYqiDYp9mE2K / Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5 2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K / Yp9mE2LHYrdmF2YYNCg == -089e0141aa264e929a0514593016 Content-Type: Текст / html; charset = UTF-8 Content-Transfer-Encoding: base64 « `

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

  • Текст, который должен быть закодирован, преобразуется в его соответствующие десятичные значения, то есть в их эквивалент ASCII (то есть a: 97, b: 98 и т. Д.). Вот таблица ASCII .
  • Десятичные значения, полученные на предыдущем этапе, преобразуются в их двоичные эквиваленты (т.е. 97: 01100001).
  • Все двоичные эквиваленты объединяются, получая большой набор двоичных чисел.
  • Большой набор двоичных чисел разделен на равные секции, причем каждая секция содержит только 6 битов.
  • Равные наборы из 6 бит преобразуются в их десятичные эквиваленты.
  • Наконец, десятичные эквиваленты преобразуются в их значения Base64 (т.е. 4: E). Вот десятичные значения и их алфавит Base64 .

Декодирование Base64 является противоположностью кодирования Base64. Другими словами, это выполняется путем изменения шагов, описанных в предыдущем разделе.

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

  • Каждый символ в строке заменяется своим десятичным значением Base64.
  • Полученные десятичные значения преобразуются в их двоичные эквиваленты.
  • Первые два бита двоичных чисел усекаются из каждого полученного двоичного числа, и наборы из 6 битов объединяются, образуя одну большую строку двоичных цифр.
  • Большая строка двоичных цифр, полученная на предыдущем шаге, разбивается на группы по 8 бит.
  • 8-битные двоичные числа преобразуются в их десятичные эквиваленты.
  • Наконец, полученные десятичные значения преобразуются в их эквивалент ASCII.

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

Я буду использовать следующее двоичное изображение. Идите вперед, загрузите его и давайте получим Python! (Я предполагаю, что название изображения deer.gif .)

deer.gif

Первое, что нам нужно сделать, чтобы использовать Base64 в Python, это импортировать модуль base64 :

import base64

Чтобы кодировать изображение, мы просто используем функцию base64.encodestring(s) . Python упоминает следующее относительно этой функции:

Кодируйте строку s, которая может содержать произвольные двоичные данные, и возвращайте строку, содержащую одну или несколько строк данных в кодировке base64. encodestring () возвращает строку, содержащую одну или несколько строк данных в кодировке base64, всегда включая дополнительный завершающий символ новой строки (‘\ n’).

Таким образом, мы можем сделать следующее, чтобы Base64 кодировал наше изображение:

plain import base64 image = open('deer.gif', 'rb') #open binary file in read mode image_read = image.read() image_64_encode = base64.encodestring(image_read)

Если вы хотите увидеть выходные данные процесса кодирования, введите следующее:

print image_64_encode

Чтобы декодировать изображение с помощью Python, мы просто используем base64.decodestring(s) . Python упоминает следующее относительно этой функции:

Декодируйте строку s, которая должна содержать одну или несколько строк данных в кодировке base64, и возвращайте строку, содержащую результирующие двоичные данные.

Итак, чтобы декодировать изображение, которое мы закодировали в предыдущем разделе, мы делаем следующее:

base64.decodestring(image_64_encode)

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

python import base64 image = open('deer.gif', 'rb') image_read = image.read() image_64_encode = base64.encodestring(image_read) image_64_decode = base64.decodestring(image_64_encode) image_result = open('deer_decode.gif', 'wb') # create a writable image and write the decoding result image_result.write(image_64_decode)

Если вы откроете deer_decode.gif который у вас есть на рабочем столе, вы заметите, что у вас есть исходное изображение deer.gif мы закодировали на первом шаге.

Как мы видели из этой статьи, Python очень легко выполняет сложную задачу.

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.