Один байт, два символа

Шестнадцатеричное, или hex, — это основание 16: шестнадцать цифр, 0-9, а затем A-F, где AF представляют значения от 10 до 15. RFC 4648 называет это кодирование Base16. Его определяющее свойство просто и полезно: байт — это всегда ровно два шестнадцатеричных символа. Байт содержит значение от 0 до 255, и две шестнадцатеричные цифры покрывают ровно этот диапазон (16 × 16 = 256). Четыре старших бита (ниббл) становятся первым символом, а четыре младших бита — вторым.

Так байт 0x48 — это буква H в ASCII, а в hex он записывается как 48. Слово foobar — это шесть байт, что в hex составляет двенадцать символов 666F6F626172. Нет ни дополнения, ни выравнивания блоков, о которых нужно беспокоиться: каждый байт независимо соответствует своей собственной паре символов.

Почему hex по умолчанию для сырых байт

Hex — наименее плотное из распространённых кодирований, поскольку оно ровно удваивает размер своего ввода, поэтому его редко используют для передачи данных, когда размер имеет значение. Его ценность в читаемости для человека, инспектирующего байты. Поскольку каждый байт — это самостоятельная пара, вы можете выровнять строку hex с данными, которые она представляет, и читать её позиция за позицией, что в точности делает шестнадцатеричный дамп: байты слева в hex, их печатаемые символы справа.

Это прямое отображение — причина, по которой hex является универсальной нотацией для вещей, которые по сути являются значениями байт: хеш , напечатанный как 64 шестнадцатеричных символа (32 байта), MAC-адрес, цвет RGB вроде #1A2B3C, адрес памяти в отладчике или байты ключа шифрования. В каждом случае вы не пытаетесь сэкономить место, вы пытаетесь прочитать или сравнить точные значения байт, и hex делает это простым.

Регистр и корректность

Hex нечувствителен к регистру: ff, FF и Ff обозначают один и тот же байт, 255. По соглашению вывод в верхнем регистре, но декодировщики принимают оба. Единственное структурное правило — строка hex должна иметь чётное число цифр, потому что каждому байту нужна полная пара. Строка нечётной длины вроде ABC повреждена: остаётся одинокий ниббл без пары. А любой символ вне 0-9 и A-F просто не является hex.

Как оно соотносится

Три кодирования из RFC 4648 меняют плотность на размер алфавита. Base64 самое компактное, четыре символа на три байта, но использует большой, чувствительный к регистру алфавит с + и /. Base32 посередине, восемь символов на пять байт, с меньшим, нечувствительным к регистру и однозначным алфавитом. Hex самое большое, два символа на байт, но самое читаемое, с самыми чёткими границами байт из всех. Вы прибегаете к hex, когда человеку нужно увидеть байты, и к Base64, когда машине нужно их переместить.

Попробуйте

Выберите Hex в инструменте codec, чтобы превратить текст в его шестнадцатеричные байты или декодировать строку hex обратно в текст, всё в вашем браузере. Он игнорирует пробелы, принимает верхний или нижний регистр и отмечает результат, который является двоичным, а не читаемым текстом.