Как пользоваться
- Выберите «Кодировать», чтобы перевести текст в Base45, или «Декодировать», чтобы получить из Base45 текст или байты.
- Введите или вставьте входные данные либо откройте файл. Не удаляйте пробелы: они входят в алфавит.
- При декодировании двоичных данных, например содержимого сертификата, переключите вывод на Hex.
- Скопируйте результат или скачайте его в виде файла.
Что такое 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. Чтобы заглянуть внутрь:
- Удалите префикс
HC1:. Его четыре символа — допустимый Base45, поэтому, если их оставить, получатся неверные байты. - Декодируйте остальную часть здесь с выводом в Hex. Данные zlib обычно начинаются с байта
78. - Распакуйте байты с помощью 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.is | SH8LQEG%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 может использовать более плотный буквенно-цифровой режим.