Как декодировать Base64 в XML
- Вставьте Base64 в поле Ввод · Base64. При загрузке страницы там уже есть небольшой пример.
- XML появится в поле Результат · текст. Похоже на XML в строке статуса подтверждает, что содержимое начинается как XML-документ.
- Если между буквами видны пропуски или появилось предупреждение о двоичных данных, XML в UTF-16: выберите в поле Кодировка UTF-16LE или Автоопределение, если в начале есть метка порядка байтов.
- Скопировать результат копирует текст. Скачать сохраняет исходные байты как
decoded.xml.
Пример PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4= декодируется в:
<?xml version="1.0"?>
<note><to>you</to><body>Hello</body></note>
Закодировать XML обратно можно на странице XML в Base64.
Как узнать закодированный XML
XML начинается с <, поэтому его Base64 начинается с P, а следующие символы подсказывают больше:
| Base64 начинается с | Начало после декодирования | Типичный документ |
|---|---|---|
PD94bWwg | <?xml | Любой XML-файл с декларацией |
PHNhbWxwOlJlc3BvbnNl | <samlp:Response | Ответ SAML при входе (декодер SAML) |
PHNvYXA6RW52ZWxvcGU | <soap:Envelope | Сообщение SOAP |
PEludm9pY2U | <Invoice | Электронный счёт UBL |
//48AD8AeABtAGwA | BOM + <?xml в UTF-16LE | XML, сохранённый в UTF-16 |
Если значение, которое должно быть SAML, начинается не с P, обычно оно сжато; что с этим делать, объясняют следующие разделы.
UTF-16 и другие кодировки
Большая часть XML записана в UTF-8, его декодер и предполагает. В двух случаях нужна другая Кодировка:
- Документы в UTF-16, частые у инструментов Windows и .NET, содержат нулевой байт рядом с каждым ASCII-символом. Декодированные как UTF-8, они выглядят как двоичные данные, и инструмент об этом сообщает. С Автоопределением или UTF-16LE появляется весь текст, начиная с
<?xml version="1.0" encoding="UTF-16"?>. Скачать сохраняет байты, но называет файлdecoded.bin, так что переименуйте его в.xml. - Документы в Latin-1 или Windows-1252 объявляют
encoding="ISO-8859-1"или что-то похожее. Буквы с диакритикой в режиме UTF-8 выглядят как�; выберите объявленную кодировку, чтобы их прочитать.
XML-декларация в результате говорит, какую кодировку задумал автор. XML-парсер, читающий скачанный файл, использует эту декларацию, так что с файлом всё в порядке, даже если для показа на экране кодировку пришлось выбирать вручную.
Откуда берётся XML в Base64
Чаще всего это SAML: провайдеры идентификации отправляют приложению SAMLResponse в виде XML, закодированного в Base64, и при отладке входа его обычно копируют из вкладки «Сеть» в браузере. SOAP-сервисы и платформы электронного документооборота возвращают документы и вложения полями Base64. Почта может нести XML-вложения как MIME-части в Base64, их извлекает декодер писем.
В значениях SAMLRequest из URL редиректа XML перед кодированием сжат сырым DEFLATE, поэтому простое декодирование Base64 даёт двоичные данные. Распаковывает их декодер Base64 + gzip. Escape-последовательности %2B, %2F и %3D декодируются автоматически; если значение URL-кодировано целиком, сначала пропустите его через URL-декодер.
Base64 в XML в коде
Передавайте XML-парсеру декодированные байты, а не строку. Тогда он сам прочитает кодировку из декларации:
import base64
import xml.etree.ElementTree as ET
s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4="
root = ET.fromstring(base64.b64decode(s))
root.find("body").text # 'Hello'
// Browser
const s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4=";
const bytes = Uint8Array.from(atob(s), c => c.charCodeAt(0));
const doc = new DOMParser().parseFromString(new TextDecoder().decode(bytes), "application/xml");
Для XML в UTF-16 или Latin-1 в браузере передайте TextDecoder нужную метку кодировки. Подробнее в статьях Base64 в Python и Base64 в JavaScript.
Вопросы и ответы
Как декодировать Base64 в файл XML?
Вставьте Base64 в поле выше. Когда в строке статуса появится XML, Скачать сохранит декодированные байты как decoded.xml байт в байт, с исходной кодировкой и нетронутой подписью.
Как понять, что в Base64 лежит XML?
Документы с XML-декларацией начинаются с PD94bWwg (<?xml ). Без декларации строка всё равно начинается с P, потому что любой документ начинается с <; например, PHNhbWxwOlJlc3BvbnNl декодируется в <samlp:Response.
Инструмент умеет форматировать XML и расставлять отступы?
Нет. XML показывается ровно в том виде, в каком декодирован; опция «Форматировать JSON» работает только для JSON. Показывать исходные байты важно для подписанного XML: любое переформатирование меняет содержимое.
Почему декодированный SAML-запрос выглядит как случайные байты?
SAML-запросы, которые передаются в URL редиректа, перед кодированием в Base64 сжимаются сырым DEFLATE. Распакуйте их декодером Base64 + gzip или откройте в декодере SAML.