Как раскодировать base64 notepad

Обновлено: 04.07.2024

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

Вступление

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

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

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

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

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

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

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

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

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

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

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

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

01010000 01111001 01110100 01101000 01101111 01101110

010100 000111 100101 110100 011010 000110 111101 101110

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

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

20 7 37 52 26 6 61 46

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод

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

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

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

Как сделать кодирование и декодирование Base64 в Java, используя новые API, представленные в Java 8, а также Apache Commons.

1. Обзор

В этом уроке мы рассмотрим различные утилиты, которые предоставляют функции кодирования и декодирования Base64 в Java.

Мы в основном собираемся проиллюстрировать новые API Java 8 и служебные API, которые выходят из Apache Commons.

Дальнейшее чтение:

Руководство по кодированию/декодированию URL-адресов Java

Хеширование SHA-256 и SHA3-256 в Java

Новое Хранилище Паролей В Spring Security 5

2. Java 8 для базы 64

Java 8 наконец-то добавила возможности Base64 в стандартный API. Это делается через класс утилиты java.util.Base64 .

Давайте начнем с рассмотрения базового процесса кодирования.

2.1. Java 8 Basic Base64

Базовый кодер упрощает работу и кодирует вход как есть, без какого-либо разделения строк.

Выходные данные отображаются на набор символов в A-Za-z0-9+/ набор символов, и декодер отклоняет любой символ за пределами этого набора.

Давайте сначала закодируем простую строку :

Обратите внимание, как мы получаем полный API кодировщика с помощью простого метода GetEncoder() utility.

Теперь давайте расшифруем эту строку обратно в исходную форму:

2.2. Кодировка Java 8 Base64 Без Заполнения

В кодировке Base64 длина выходной кодированной строки должна быть кратна трем. Если нет, то вывод будет дополнен дополнительными символами pad ( = ).

После декодирования эти дополнительные символы заполнения будут отброшены. Чтобы углубиться в заполнение в Base64, ознакомьтесь с этим подробным ответом на Переполнение стека .

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

2.3. Кодировка URL-адресов Java 8

Кодировка URL-адресов очень похожа на базовый кодер, который мы рассмотрели выше. Он использует безопасный алфавит Base64 URL и имени файла и не добавляет никакого разделения строк:

Декодирование происходит во многом таким же образом. Метод утилиты getUrlDecoder() возвращает java.util.Base64.Decoder , который затем используется для декодирования URL-адреса:

2.4. Кодировка MIME Java 8

Давайте начнем с создания некоторого базового ввода MIME для кодирования:

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

Каждая строка вывода содержит не более 76 символов и заканчивается возвратом каретки, за которым следует перевод строки ( \r\n ):

Метод утилиты getMimeDecoder() возвращает java.util.Base64.Decoder , который затем используется в процессе декодирования:

3. Кодирование/Декодирование С Использованием Кодека Apache Commons

Во-первых, нам нужно определить зависимость commons-codec в pom.xml :

Обратите внимание, что мы можем проверить, были ли выпущены более новые версии библиотеки на Maven Central .

После создания API Base64 и кодирование, и декодирование довольно просты:

Метод decode() класса Base64 возвращает декодированную строку:

Другим простым вариантом является использование статического API Base64 |/вместо создания экземпляра:

4. Преобразование строки в массив байтов

Иногда нам нужно преобразовать Строку в байт[] . Самый простой способ сделать это-использовать метод String getBytes() :

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

Если наша строка Base64 закодирована, мы можем использовать декодер Base64 |:

Мы также можем использовать DatatypeConverter parseBase64Binary() метод :

Наконец, мы можем преобразовать шестнадцатеричную строку в байт[] с помощью метода DatatypeConverter :

5. Заключение

В этой статье объясняются основы кодирования и декодирования Base64 в Java с использованием новых API, представленных в Java 8 и Apache Commons.

Александр Терехов
дата публикации 17-10-2002 13:16

Вступление

Изначально для передачи электронной почты в Интернет использовался только текст (RFC822). Затем, с развитием компьютерных девайсов, потребовалась возможность передачи нетекстовой информации: аудио, видео, графических файлов, файлов приложений и т.д. Однако почтовые сервера как понимали только текст, так и остались понимать только его. Поэтому появилась необходимость каким-то образом преобразовать двоичный файл в текстовый. Вообще-то способ такого преобразования уже имел место - это UUE кодирование. Но появился еще один - base64. Этот способ используется в спецификации MIME (RFC2045-2049).

Идеология base64

Как известно, байт состоит из восьми битов :)
В один байт можно вложить 256 цифр, от 0 до 255. Однако, если вместо восьми байт использовать только шесть, то объем вложенной информации уменьшается до 64 цифр, от 0 до 63. Теперь главное: любую цифру 6-ти битового байта можно представить в виде печатного символа. 64 символа это не так много, us-ascii символов вполне хватит. Ниже представлен 64-х символьный base64 "алфавит". где код символа A - 0, а код символа / - 63.

Вроде, понятно. Что дальше?

А далее берутся три последовательных байта по восемь бит (всего 24 бита), и побитно делятся на четыре 6-ти битных байта (всего 24 бита).
Немного странно звучит: "шестибитный байт". На самом деле бит восемь, однако используются только 6 младших бит, два старших бита игнорируются.
Схематично такое "деление три к четырем" можно представить себе так:

В приведенном примере три числа 103, 193 и 58 были закодированы в base64 формат. В результате мы получили 4-х символьный стринг Z8E6. Т.о. на практике увидели идеологию перевода двоичной информации в текст по принципу 3 к 4.

Основываясь на этом принципе, мы можем закодировать любую двоичную информацию в текст, причем не очень сильно увеличивая ее объем (на 30%). Затем наша информация через почтовый сервер попадет к нужному адресату, почтовик которого декодирует текст в двоичный файл.

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

Нет, еще не все. Формат base64 имеет ограничение - общая длина строки, состоящая из 4-х символьных стрингов составляет 72 символа (за исключением самой последней строки - там уже сколько получится).

  1. Имеющейся почтовой программой сохранить в файл какое-нибудь письмо. Письмо, естественно, надо выбрать со вложенным файлом. При сохранении письма, тип файла следует выбрать "почтового формата" (e-mail message), например *.msg или *.eml
  2. Включить самый мощный текстовый редактор - Notepad ("Блокнот") и открыть сохраненный файл письма. Тем, у кого п.2 не получился с первого раза - тип файла при открытии его "Блокнотом" надо указать "Все файлы" (*.*)
  3. В "Блокноте" (а если файл большой, то в WordPad'е) откроется примерно нижеследующее:

Полный текст можно посмотреть в файле EMail.txt.

Алгоритм base64 кодирования и декодирования.

Рассмотрим шаг 1.

Как видно из приведенной схемы, проверить установку старшего бита совсем несложно. Если результатом операции получается число 128, значит бит установлен, а если в результате получаем 0, значит старший бит не установлен. Далее в зависимости от полученного результата применим к 6-ти битовому байту битовую операцию OR с числом 1, которая в любом случае применения устанавливает первый (младший) байт в 1. Здесь необходимо учитывать то, что перед применением побитовой операции OR с числом 1 младший бит 6-ти битового байта всегда 0. В случае для первых двух шагов потому, что мы сами обнуляем его при инициализации, для последующих шагов, потому что применяем операцию SHR.

Итак, посмотрим как выглядит реализация первого шага в Паскале:

Повторяем шаги 1 и 2 шесть раз для каждого бита 6-ти битного байта. Одновременно необходимо следить за тем, что если мы обработали восемь бит байта-источника, следует перейти к новому байту. И последнее - если обработаны все три байта-источники, следует выйти из функции кодирования.

Теперь о декодировании.

Примеры.

В первом примере ( b64_Example1 5К) показана работа модуля base64-кодирования (декодирования). Три восьмибитных байта кодируются в 4-х символьный стринг и обратно. Понятно, что это всего лишь пример и при вводе цифр и букв следует соблюдать base64-алфавит.

Конечно, при кодировании надо считывать по 58 байт, а не по 3, как это сделано в примере. Считывание по 58 байт значительно увеличит "скорострельность" утилиты. Но следует учитывать, что это всего лишь пример.

Пример очередного изобретения велосипеда :)

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Может быть было где-то здесь уже, но по крайней мере я не нашел.

Иногда нужно файл закодировать в текстовый вид при помощи кодировки base64, или наоборот раскодировать.

Раньше для этого я использовал утилиту base64.exe или Total Commander
Но проблема в том, что это сторонние инструменты.

Оказывается можно обойтись средствами ОС.
Есть в составе ОС Windows утилита certutil.exe предназначенная для работы с сертификатами.
Так вот, при помощи этой утилиты и можно кодировать/декодировать в/из base64 любые файлы. Для этого используются ключи -encode и -decode соответственно.

Пример:
Имеем текстовый файл file.txt с текстом: "Hello, world!"

на выходе имеем файл file.b64:

В общем как-то так
Век живи, век учись

  • Serge Yolkin
  • Разработчик
  • Неактивен

Ага. Она ещё и хэш SHA1 считать умеет.

P.S. И не только SHA1, ещё и SHA256, SHA384, SHA512, MD2, MD4, MD5, но параметр HashAlgorithm обязательно должен быть в ВЕРХНЕМ РЕГИСТРЕ.

  • Flasher
  • Заблокирован
  • Неактивен











Есть в составе ОС Windows утилита certutil.exe

На XP SP3 по умолчанию нет.

или Total Commander
Но проблема в том, что это сторонние инструменты.


Сторонние, но использовать тот же ТС только для этих целей (или как у некоторых - для FTP) - какое-то сомнительное по КПД занятие.

base64.exe, кстати, есть в двух вариантах. Плюс есть скриптовые решения. Я же периодически обращаюсь к UUDeview.

Есть в Windows 7 Pro, Server 2003 R2 Standard, Server 2008 R2 Standard, Server 2008 R2 Foundation;
По идее должна быть в Vista, 8, Server 2008/2012 Standart;
И всё-таки XP уже является устаревшей и неподдерживаемой ОС.

base64.exe, кстати, есть в двух вариантах. Плюс есть скриптовые решения. Я же периодически обращаюсь к UUDeview.

Есть ли в Mac OS X команда терминала, которая будет base64 кодировать файл или стандартный ввод?

Имейте в виду , что , хотя base64 кодирующая синтаксис согласуется с одной ОС на другую, синтаксис base64-декодирование либо base64 -d или в base64 -D зависимости от вашей операционной системы. OSX использует -D . @ChrisJohnson Если используется совместно с openssl флагом для декодирования -d на OS X (10.10 Yosemite).

openssl может сделать это для вас, и все это установлено с OS X по умолчанию; нет необходимости устанавливать darwinports.

Без -in опции читает из стандартного ввода

Используйте openssl base64 < path/to/file.jpg | tr -d '\n' | pbcopy или, cat path/to/file.jpg | openssl base64 | tr -d '\n' | pbcopy чтобы пропустить запись в файл и просто скопировать вывод в кодировке base64 в буфер обмена без разрывов строк. В Mac, чтобы Base64 кодировать строку: openssl base64 -e <<< ram и декодировать: openssl base64 -d <<< cmFtCg== @Ram, openssl base64 -e <<< ram фактически кодирует 4 байта, включая перевод строки в конце; см hexdump <<< ram .

Openssl можно использовать более кратко:

[echo -n -> необходимо использовать, иначе будет выполнено кодирование, включая символ новой строки]

Однако решение "echo" добавляет символ LF (перевод строки) в конец строки ввода. Лучшее использование: echo -n 'input' И даже немного более кратким openssl base64 <<< input Или просто использовать base64 без openssl . В любом случае мне нужно дважды нажать Ctrl + D. И будьте осторожны, @Garret: в Bash, с или без openssl , openssl base64 <<< superuser и openssl base64 <<< "superuser" ошибочно возвращаются c3VwZXJ1c2VyCg== , поскольку «здесь строка» тогда все еще включает перевод строки! ( Очевидно, не только в Bash, но также в zsh, ksh и yash. См hexdump <<< superuser . Результат Base64 должен быть c3VwZXJ1c2Vy .)

Это должно быть доступно по умолчанию на OS X.

Добавьте, --decode чтобы полностью изменить процесс от base64 к нормальному. Это лучше для кодирования SVG, потому что он создает одну строку. Это чище, чем на выходе openssl base64 . Спасибо!

base64 команда доступна по умолчанию на моем OS X 10.9.4.

Вы можете использовать base64 <<< string и base64 -D <<< string для кодирования и декодирования строки в терминале, или base64 -in file и base64 -D -in file для кодирования и декодирования файла.

У вас есть пример? Я получаю Invalid characer in input stream при использовании <<< . Я пытался с " , ' и ничего вокруг строки. @Jonas В какой ты скорлупе? Вы можете использовать это в bash и zsh.

Поскольку Python поставляется с OS X по умолчанию, вы можете использовать его, как показано ниже:

Или установите coreutils через Brew ( brew install coreutils ), которая будет предоставлять base64 команду:

В macOS я всегда использую:

echo -n "STRING" | base64

-n - избегать символа новой строки в конце строки.

С точки зрения скорости, я бы использовал openssl, за которым следует perl, а затем uuencode. С точки зрения переносимости, я бы использовал uuencode, за которым следует Perl, за которым следует openssl (если вы хотите повторно использовать код на как можно большем количестве других UNIX-подобных платформ). Будьте осторожны, поскольку не все варианты UNIX поддерживают ключ -m (iirc AIX поддерживает, HP / UX поддерживает Solaris).

Читайте также: