Кодировщик и декодер Base45

Преобразуйте текст, шестнадцатеричные байты или файлы в Base45 и обратно. Base45 использует 45 символов буквенно-цифрового режима QR-кода, поэтому двоичные данные помещаются в QR-код с небольшими накладными расходами.

Работает полностью в браузере. Данные никуда не загружаются.

Как пользоваться

  1. Выберите «Кодировать», чтобы перевести текст в Base45, или «Декодировать», чтобы получить из Base45 текст или байты.
  2. Введите или вставьте входные данные либо откройте файл. Не удаляйте пробелы: они входят в алфавит.
  3. При декодировании двоичных данных, например содержимого сертификата, переключите вывод на Hex.
  4. Скопируйте результат или скачайте его в виде файла.

Что такое Base45?

Base45 описан в RFC 9285. Его алфавит состоит из цифр 0-9, заглавных букв A-Z и девяти символов: пробела и $ % * + - . / :. Это ровно те 45 символов, которые QR-код может хранить в компактном буквенно-цифровом режиме. Обратите внимание: пробел — это полноценный символ алфавита, а не разделитель.

Кодировщик берёт входные данные по два байта, читает их как число от 0 до 65535 и записывает это число тремя цифрами Base45, начиная с младшей. Последний одиночный байт превращается в два символа. В виде текста результат в 1,5 раза больше входных данных — больше, чем у Base64.

Почему Base45 подходит для QR-кодов

В буквенно-цифровом режиме QR-код упаковывает два символа в 11 бит. Base64 не может использовать этот режим, потому что ему нужны строчные буквы, поэтому он переходит в байтовый режим с 8 битами на символ, то есть примерно 10,7 бита на каждый байт данных. Base45 в буквенно-цифровом режиме требует всего 8,25 бита на байт, поэтому те же данные помещаются в QR-код меньшего размера, который проще отсканировать.

При декодировании сохраняйте пробелы в точности как есть; игнорируются только переводы строк. Строчные буквы не входят в алфавит и считаются недопустимыми.

Декодирование цифровых COVID-сертификатов ЕС

QR-коды цифровых COVID-сертификатов ЕС содержат текст, который начинается с HC1:. Остальная часть — это Base45: данные сертификата закодированы в CBOR, подписаны с помощью COSE, сжаты zlib и затем закодированы в Base45. Чтобы заглянуть внутрь:

  1. Удалите префикс HC1:. Его четыре символа — допустимый Base45, поэтому, если их оставить, получатся неверные байты.
  2. Декодируйте остальную часть здесь с выводом в Hex. Данные zlib обычно начинаются с байта 78.
  3. Распакуйте байты с помощью zlib и разберите CBOR другим инструментом.

Этот инструмент выполняет только этап Base45. Он не распаковывает данные, не разбирает их и не проверяет подпись.

Base45 в программах

# Python (pip install base45)
import base45
base45.b45encode(b'AB')     # пример из RFC 9285: BB8
base45.b45decode('BB8')     # b'AB'

Спецификация

Алфавит0-9 A-Z пробел $ % * + - . / :
Размер результата3 символа на каждые 2 байта (150%)
ДополнениеНет
СтандартRFC 9285
Учёт регистраДа

Примеры

Исходные данные (UTF-8)Результат
Hello, World!%69 VDK2E:3404ESVDX0
Base64.isSH8LQEG%61*5P2
你好C-SEFK*.K

Часто задаваемые вопросы

Почему в результате Base45 есть пробелы?

Пробел — один из 45 символов алфавита, поэтому он несёт данные. Не обрезайте и не схлопывайте пробелы в тексте Base45, иначе декодирование завершится ошибкой или даст неверные байты.

Как декодировать строку HC1:?

Удалите префикс HC1:, декодируйте остальное с выводом в Hex, затем распакуйте результат с помощью zlib и прочитайте данные CBOR отдельным инструментом. Этот инструмент выполняет только этап Base45.

Учитывает ли Base45 регистр?

Да. В алфавит входят только заглавные буквы, потому что в буквенно-цифровом режиме QR-кода нет строчных. О строчных буквах во входных данных сообщается как о недопустимых, вместе с их позицией.

Base45 компактнее, чем Base64?

В виде обычного текста — нет: Base45 в 1,5 раза больше входных данных, а Base64 — примерно в 1,33 раза. Внутри QR-кода — да, потому что Base45 может использовать более плотный буквенно-цифровой режим.