belun.app Блог
EN

Текст в HEX: как работает шестнадцатеричная кодировка

Что такое hex-байты, как UTF-8 превращает символы в шестнадцатеричный код и где вы встречаете hex каждый день — от цветов CSS до hex-дампов.

Экран с шестнадцатеричным кодом и байтами данных — исходная форма перевода текста в HEX

HEX — из тех вещей, которыми пользуешься годами, пока кто-нибудь не объяснит. Вы вписывали #ff5733 в CSS. Видели git-коммит, начинающийся с a67cde0. И то, и другое — шестнадцатеричный код, и как только идея щёлкает, многое в программировании перестаёт выглядеть набором загадочных символов. Конвертер текста в HEX — самый быстрый способ увидеть связь между текстом, который вы читаете, и байтами под ним.

Зачем нужна система с основанием 16

Мы считаем в десятичной системе, потому что у нас десять пальцев. Компьютер считает в двоичной — провод либо под напряжением, либо нет. Шестнадцатеричная система — основание 16 — это переводчик между ними.

Фокус в том, что одна hex-цифра ровно соответствует четырём битам, а две hex-цифры складываются в целый байт. В байте помещается значение от 0 до 255 — это 00ff в 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, показывает число символов рядом с числом байтов — так сразу видно многобайтовые символы — и не отправляет на сервер ни байта. Попробуйте своё имя и посмотрите, как оно превращается в числа.

Попробуйте инструмент

Конвертер текста в HEX →