Как пользоваться кодировщиком Base16
- Введите или вставьте текст в поле ввода. Результат в Base16 обновляется по мере набора.
- Кодировка под полем ввода определяет, как символы превращаются в байты. По умолчанию это UTF-8.
- Чтобы декодировать, нажмите Base16 (RFC 4648) → Текст над инструментом или кнопку ⇄ Поменять местами, которая заодно переносит текущий результат в поле ввода. Строчные цифры, пробелы и двоеточия во вводе допускаются.
- Заберите результат кнопкой Скопировать результат или Скачать. Меню Из и В переключают на другие форматы, например Base32 или Base64, если нужно сравнить.
Если нужен hex с разделителями, префиксами 0x или строчными буквами, откройте Текст в hex: там есть эти опции.
Base16 и RFC 4648
RFC 4648 описывает Base64, Base32 и Base16 в одном документе, и Base16 из них самая простая: в ней нет ни дополнения, ни переносов строк, ни перегруппировки битов. Каждый байт делится на две 4-битные половины, и каждая половина соответствует одному символу. Тестовые векторы из самого RFC:
| Ввод | Base16 |
|---|---|
| (пусто) | (пусто) |
f | 66 |
fo | 666F |
foo | 666F6F |
foob | 666F6F62 |
fooba | 666F6F6261 |
foobar | 666F6F626172 |
Длина результата всегда ровно вдвое больше числа байтов, поэтому Base16 и не нужен символ дополнения. Base64 и Base32 группируют по нескольку байтов в блок и поэтому дополняют последний блок знаками =. В обзоре RFC указано, где описана каждая из этих кодировок.
Base16, Base32 и Base64
12 байт Hello, world в каждой кодировке RFC 4648:
| Кодировка | Результат | Длина |
|---|---|---|
| Base16 | 48656C6C6F2C20776F726C64 | 24 |
| Base32 | JBSWY3DPFQQHO33SNRSA==== | 24 (20 без дополнения) |
| Base64 | SGVsbG8sIHdvcmxk | 16 |
Base16 жертвует размером ради ясности. Байты читаются прямо с экрана, значения сравниваются цифра за цифрой, и такая запись проходит через любую систему, которая понимает буквы и цифры, в том числе нечувствительную к регистру. Base64 на треть короче, и его берут по умолчанию, когда байты передаются внутри JSON, писем или URL. В сравнении кодировок разобраны ещё Base58 и Base85.
Где встречается Base16
- Хеши и контрольные суммы, которые
sha256sumи похожие утилиты обычно печатают строчными. - Отпечатки ключей OpenPGP, которые GnuPG выводит в hex в верхнем регистре группами по четыре.
- Тестовые векторы в RFC и других спецификациях, где однозначность байтовых значений важнее длины.
- Протоколы и форматы, которым нужны данные без учёта регистра или только из букв и цифр.
Чтобы перевести такое значение в Base64, например хеш, который API ждёт в Base64, используйте Hex в Base64; Base64 в hex работает в обратную сторону.
Base16 в коде
import base64
base64.b16encode(b"Hello").decode() # '48656C6C6F'
base64.b16decode("48656c6c6f", casefold=True) # b'Hello'
printf 'Hello' | basenc --base16 # 48656C6C6F
echo 48656C6C6F | basenc --base16 -d # Hello
basenc входит в GNU coreutils начиная с версии 8.31. В Node.js тот же результат даёт Buffer.from("Hello").toString("hex").toUpperCase(). Как те же модули работают с Base64, показано на страницах Python и Bash.
Вопросы и ответы
Base16 совпадает с шестнадцатеричной записью?
Для байтов да. Так RFC 4648 называет hex-кодирование: каждый байт превращается в два символа из 0123456789ABCDEF. RFC предписывает верхний регистр, а в повседневной практике hex часто пишут строчными.
Насколько Base16 больше исходных данных?
Ровно вдвое, то есть +100%. Base32 добавляет 60%, Base64 около 33%. Из кодировок RFC 4648 Base16 наименее компактная и самая читаемая.
Почему b16decode в Python отвергает мою строку?
base64.b16decode по умолчанию принимает только верхний регистр. Для строчных передайте casefold=True или используйте bytes.fromhex(), который понимает оба регистра и пробелы.