Допустим, вам нужно передать по сети бинарный графический файл.
Когда вы это сделаете, вы с удивлением обнаружите, что файл был неправильно принят на другом конце, и что он содержит странные символы. Это происходит потому, что вы пытаетесь отправить файл в формате байтов, в то время как используемый канал предназначен для передачи текста.
Каким должно быть решение, чтобы избежать такой проблемы?
Ответ кроется в кодировке Base64. В этой статье я собираюсь показать, как мы можем использовать Python для кодирования и декодирования двоичного изображения.
Программа, которую мы сегодня создадим, предполагает использование в качестве автономной локальной программы, но вы можете применять ее для различных концепций, таких как отправка закодированного изображения с мобильного устройства на сервер, и многих других приложений.
Содержание
Что такое кодирование Base64?
Прежде чем перейти к этому, давайте определим, что мы подразумеваем под Base64.
Base64 – это способ, с помощью которого 8-битные двоичные данные кодируются в формат, который можно представить в 7 битах. Для этого используются только символы A-Z, a-z, 0-9, + и / для представления данных. Символ = используется для данных прокладок. Например, при таком кодировании три 8-битных байта превращаются в четыре 7-битных байта.
Термин base 64 происходит от стандарта Multipurpose Internet Mail Extensions (MIME), который широко используется для HTTP и XML, и изначально был разработан для кодирования вложений электронной почты и их правильной передачи.
Для чего мы используем Base64?
Base64 очень важен для отображения двоичных данных, настолько, что позволяет представлять двоичные данные так, что они выглядят и ведут себя как обычный текст. Это делает более безопасным их хранение в базах данных, отправку по электронной почте или использование в текстовых форматах, таких как XML.
Base64 в основном используется для представления данных в формате ASCII.
Как мы уже говорили во введении к этой статье, без Base64 данные вообще не могут быть прочитаны.
Кодирование Base64
Кодирование Base64 – это процесс преобразования двоичных данных в набор символов, ограниченный 64 символами. Как мы уже говорили в первом разделе, это символы A-Z, a-z, 0-9, + и / (Вы посчитали их? Вы заметили, что в сумме они составляют 64?). Этот набор символов считается наиболее распространенным и известен как Base64 в MIME. Он использует A-Z, a-z, 0-9, + и / для первых 62 значений и + и / для последних двух значений.
Закодированные в Base64 данные в итоге оказываются больше исходных данных, поэтому, как мы уже говорили, на каждые 3 байта двоичных данных приходится как минимум 4 байта закодированных в Base64 данных. Это связано с тем, что вы сжимаете данные в меньший набор символов.
Вы когда-нибудь видели необработанный файл электронной почты, подобный тому, который показан ниже? Если да, то вы видели кодирование Base64 в действии.
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix 2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5 2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg== --089e0141aa264e929a0514593016 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64
Кодирование Base64 выполняется в несколько этапов:
- Текст, который необходимо закодировать, преобразуется в соответствующие десятичные значения, т.е. в его ASCII-эквивалент (например, a: 97, b: 98 и т.д.).
- Десятичные значения, полученные на предыдущем этапе, преобразуются в их двоичные эквиваленты (т.е. 97: 01100001).
- Все двоичные эквиваленты объединяются, в результате чего получается большой набор двоичных чисел.
- Большой набор двоичных чисел разделен на равные части. Каждая секция должна содержать только 6 бит.
- Равные наборы из 6 битов преобразуются в их десятичные эквиваленты.
- Наконец, десятичные эквиваленты преобразуются в свои значения Base 64 (т.е. 4:E).
Декодирование Base64
Декодирование Base64 противоположно кодированию Base64. Другими словами, это делается путем обратных действий, описанных в предыдущем пункте.
Таким образом, этапы декодирования Base64 можно описать следующим образом:
- Каждый символ в строке изменяется на его десятичное значение Base64.
- Полученные десятичные значения преобразуются в их двоичные эквиваленты.
- Первые два бита двоичных чисел усекаются для каждого из полученных двоичных чисел, и наборы из 6 бит объединяются, образуя большую строку двоичных цифр.
- Большая строка двоичных цифр, полученная на предыдущем этапе, делится на наборы из 8 бит.
- 8-битные двоичные числа преобразуются в их десятичные эквиваленты.
- Наконец, полученные десятичные значения преобразуются в их эквиваленты ASCII.
Кодирование изображения
Теперь перейдем к сути дела. В этом разделе я покажу вам, как мы можем легко закодировать изображение в Base64 с помощью Python. Для этого я собираюсь использовать следующий двоичный образ. (Имя файла изображения – deer.gif).
Первое, что нам нужно сделать, чтобы использовать Base64 в Python, – это импортировать модуль Base64:
import base64
Code language: JavaScript (javascript)
Для кодирования нашего изображения в Base64 нужно сделать следующее:
import base64
image = open('deer.gif', 'rb') #открывает двоичный файл в режиме чтения
image_read = image.read()
image_64_encode = base64.encodestring(image_read)
Code language: PHP (php)
Если вы хотите увидеть результат процесса кодирования, введите следующее:
print image_64_encode
Code language: PHP (php)
Декодирование изображения
Чтобы декодировать изображение с помощью Python, мы просто используем функцию base64.decodestring(s).
Таким образом, чтобы декодировать изображение, которое мы закодировали в предыдущем разделе, делаем следующее:
base64.decodestring(image_64_encode)
Code language: CSS (css)
Собираем все вместе
Давайте соберем код, которая кодирует и декодирует изображение Base64.
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') # создание изображения, доступного для записи, и запись результата декодирования
image_result.write(image_64_decode)
Code language: PHP (php)