Текст в HEX: как работает шестнадцатеричная кодировка
Что такое hex-байты, как UTF-8 превращает символы в шестнадцатеричный код и где вы встречаете hex каждый день — от цветов CSS до hex-дампов.
HEX — из тех вещей, которыми пользуешься годами, пока кто-нибудь не объяснит. Вы вписывали #ff5733 в CSS. Видели git-коммит, начинающийся с a67cde0. И то, и другое — шестнадцатеричный код, и как только идея щёлкает, многое в программировании перестаёт выглядеть набором загадочных символов. Конвертер текста в HEX — самый быстрый способ увидеть связь между текстом, который вы читаете, и байтами под ним.
Зачем нужна система с основанием 16
Мы считаем в десятичной системе, потому что у нас десять пальцев. Компьютер считает в двоичной — провод либо под напряжением, либо нет. Шестнадцатеричная система — основание 16 — это переводчик между ними.
Фокус в том, что одна hex-цифра ровно соответствует четырём битам, а две hex-цифры складываются в целый байт. В байте помещается значение от 0 до 255 — это 00–ff в hex. Именно из-за этого чистого соответствия hex победил десятичную запись в низкоуровневой работе: ff читать и набирать удобнее, чем 11111111, и он идеально ложится на то, как устроена память.
В hex используются цифры 0–9, а для значений от десяти до пятнадцати берутся буквы a–f. Так что a — это 10, f — 15, 10 — это шестнадцать (а не десять), а ff — 255.
От символов к байтам
Вот тут и важна кодировка. У буквы H кодовая точка 72. В hex это 48. Слово «Hello» превращается в такое:
- H → 48
- e → 65
- l → 6c
- l → 6c
- o → 6f
Значит, «Hello» — это 48 65 6c 6c 6f. Обычный английский текст остаётся по байту на символ, потому что ASCII умещается в один байт.
За пределами ASCII становится интереснее. Наш конвертер использует UTF-8 — кодировку, на которой работает почти весь современный веб. В UTF-8 символы вне базового набора занимают больше одного байта:
é→c3 a9€→e2 82 ac- кириллическая
Ж→d0 96 - большинство эмодзи → четыре байта
Именно поэтому русский текст в hex вдвое длиннее английского той же длины: каждая буква — это два байта. И по той же причине твит с эмодзи упирается в лимит символов раньше, чем ожидаешь.
Где hex встречается на практике
Hex — не абстрактное упражнение. Он попадается постоянно:
- Цвета.
#ff5733— это три байта: красныйff, зелёный57, синий33. Максимум красного, средне зелёного, мало синего — тёплый оранжевый. - Hex-дампы.
xxdиhexdumpпоказывают сырые байты файла в hex, чтобы можно было разобрать бинарный формат или найти лишний байт. - Escape-последовательности.
\x48в строковом литерале или%48в URL — это байт, записанный в hex. - Хеши и идентификаторы. MD5, SHA-256, хеши git-коммитов и MAC-адреса — всё это hex-строки.
- Отладка. Когда файл не парсится, дамп в hex часто вскрывает невидимый BOM или перенос строки
0d 0aтам, где ожидался0a.
Последний пункт не раз стоил мне часа. Конфиг выглядел точь-в-точь как рабочий, но hex-дамп показал в самом начале BOM в UTF-8 — ef bb bf, — который тихо ломал парсер.
Кодируйте, декодируйте и проверяйте себя
Вставьте текст в верхнее поле Конвертера текста в HEX, чтобы увидеть байты, или бросьте hex в нижнее поле, чтобы прочитать обратно. Он понимает пробелы, двоеточия и префиксы 0x, показывает число символов рядом с числом байтов — так сразу видно многобайтовые символы — и не отправляет на сервер ни байта. Попробуйте своё имя и посмотрите, как оно превращается в числа.