Скажем, у вас есть двоичный файл изображения, который вы хотите передать по сети. Вы удивлены тем, что файл не был принят с другой стороны — файл просто содержал странные символы!
Что ж, похоже, вы пытались отправить файл в необработанном формате битов и байтов, в то время как используемый носитель был предназначен для потоковой передачи текста.
Какой обходной путь поможет избежать такой проблемы? Ответ — кодировка Base64. В этой статье я покажу вам, как мы можем использовать Python для кодирования и декодирования двоичного изображения. Программа показана как отдельная локальная программа, но вы можете применить эту концепцию к различным приложениям, таким как отправка закодированного изображения с вашего мобильного устройства на сервер, и ко многим другим приложениям.
Что такое Base64?
Прежде чем углубляться в статью, давайте определим, что мы подразумеваем под Base64.
Base64 — это способ, которым 8-битные двоичные данные кодируются в формате, который может быть представлен в 7 битах. Это делается с использованием только символов AZ
, az
, 0-9
, +
и /
для представления данных, с =
используется для заполнения данных. Например, используя это кодирование, три 8-битных байта преобразуются в четыре 7-битных байта.
Термин Base64 взят из стандарта Multipurpose Internet Mail Extensions (MIME) , который широко используется для HTTP и XML, и первоначально был разработан для кодирования вложений электронной почты для передачи.
Почему мы используем Base64?
Base64 очень важен для представления двоичных данных, так что он позволяет представлять двоичные данные в виде, который выглядит и действует как простой текст, что делает его более надежным для хранения в базах данных, отправки по электронной почте или использования в текстовом формате. формат, такой как XML. Base64 в основном используется для представления данных в строковом формате ASCII .
Как упоминалось во введении к этой статье, иногда без Base64 данные вообще не будут читаться.
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 можно описать следующим образом:
- Каждый символ в строке заменяется своим десятичным значением Base64.
- Полученные десятичные значения преобразуются в их двоичные эквиваленты.
- Первые два бита двоичных чисел усекаются из каждого полученного двоичного числа, и наборы из 6 битов объединяются, образуя одну большую строку двоичных цифр.
- Большая строка двоичных цифр, полученная на предыдущем шаге, разбивается на группы по 8 бит.
- 8-битные двоичные числа преобразуются в их десятичные эквиваленты.
- Наконец, полученные десятичные значения преобразуются в их эквивалент ASCII.
Кодирование изображения
Давайте теперь перейдем к сути этой статьи. В этом разделе я покажу вам, как мы можем легко кодировать Base64 изображение с помощью Python.
Я буду использовать следующее двоичное изображение. Идите вперед, загрузите его и давайте получим Python! (Я предполагаю, что название изображения 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 с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.