Hex (шестнадцатеричное) кодирование: гид
Что такое hex, цветовые коды, hex dump, использование в программировании и отладке.
Введение
Шестнадцатеричная система счисления, или hex — это один из самых распространённых способов представления бинарных данных в человекочитаемом виде. Любой байт записывается ровно двумя hex-цифрами, что делает hex идеальным инструментом для отладки, описания цветов в CSS, кодирования MAC-адресов, записи хешей и многого другого. В этой статье разберём, как устроена шестнадцатеричная система, где она применяется и как конвертировать данные между hex и другими форматами.
Для практической работы используйте наши инструменты: Hex в RGB конвертер и текст в hex.
Что такое шестнадцатеричная система
В привычной нам десятичной системе используется десять цифр: 0–9. В шестнадцатеричной цифр шестнадцать: 0–9 плюс буквы A, B, C, D, E, F (или строчные a–f), которые представляют значения 10, 11, 12, 13, 14, 15. Таким образом, один hex-разряд может хранить 16 значений — ровно 4 бита.
Таблица соответствия:
| Десятичная | Hex | Двоичная |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| 2 | 2 | 0010 |
| 3 | 3 | 0011 |
| 4 | 4 | 0100 |
| 5 | 5 | 0101 |
| 6 | 6 | 0110 |
| 7 | 7 | 0111 |
| 8 | 8 | 1000 |
| 9 | 9 | 1001 |
| 10 | A | 1010 |
| 11 | B | 1011 |
| 12 | C | 1100 |
| 13 | D | 1101 |
| 14 | E | 1110 |
| 15 | F | 1111 |
Поскольку один hex-разряд — это 4 бита, два hex-разряда идеально представляют один байт (8 бит). Это и делает hex настолько популярным: любое бинарное значение можно записать hex-строкой в два раза короче, чем двоичной строкой.
Префиксы и обозначения
Чтобы отличить hex-числа от десятичных, используются разные обозначения в зависимости от контекста:
- 0x — префикс в C, C++, Java, JavaScript, Python:
0xFF,0x1A - # — в CSS для цветов:
#FF0000(красный) - $ — в Pascal и ассемблерах:
$FF - h — суффикс в ассемблерах:
0FFh - Без префикса — в большинстве контекстов, если понятно из контекста:
FF
Где применяется hex
1. Цвета в вебе (CSS)
В CSS цвет записывается как #RRGGBB, где RR, GG и BB — hex-значения красного, зелёного и синего каналов от 00 до FF. Например:
#FF0000— чистый красный#00FF00— чистый зелёный#0000FF— чистый синий#FFFFFF— белый#000000— чёрный#1A2B3C— произвольный цвет
Современный CSS поддерживает также 4-байтовую запись с альфа-каналом#RRGGBBAA и сокращённую запись #RGB. Подробнее о цветовых моделях — в нашей статье о теории цвета.
2. MAC-адреса
Сетевой адрес устройства записывается как шесть байтов в hex, разделённых двоеточием или дефисом: 00:1A:2B:3C:4D:5E. Это канонический формат MAC-адреса.
3. IPv6-адреса
IPv6 состоит из 128 бит, записанных как 8 групп по 4 hex-цифры, разделённых двоеточием:2001:0db8:85a3:0000:0000:8a2e:0370:7334. Группы из нулей можно сокращать:::.
4. Хеши и контрольные суммы
Результат работы хеш-функций (MD5, SHA-1, SHA-256) традиционно выводится в hex. Например, SHA-256 от строки «hello»:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824Подробнее о хеш-функциях — в статьях о MD5 и о SHA-256.
5. Hex dump при отладке
Программы вроде hexdump, xxd или HxD показывают содержимое бинарного файла в виде таблицы: слева — адреса, посередине — hex-байты, справа — ASCII представление. Это стандартный инструмент при анализе неизвестных форматов файлов или сетевых пакетов.
00000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 0a |Hello, world!.|
0000000e6. UUID и GUID
Уникальные идентификаторы UUID записываются в hex и разделяются дефисами:550e8400-e29b-41d4-a716-446655440000. Подробнее — в статье о генерации UUID.
7. Programming: побитовые операции
В программировании hex удобен для записи битовых масок и флагов. Например, флаги доступа0xFF (все 8 бит установлены), 0x0F (младшая половина байта),0x80 (только старший бит).
Преобразование hex в другие системы
Hex в десятичную
Чтобы перевести hex в десятичную, каждую цифру умножаем на соответствующую степень 16 и складываем. Например, 0x2A:
0x2A = 2 * 16 + 10 = 42Для большего числа, например 0xDEAD:
0xDEAD = 13 * 4096 + 14 * 256 + 10 * 16 + 13
= 53248 + 3584 + 160 + 13
= 57005Десятичная в hex
Обратная операция — последовательное деление на 16 с запоминанием остатков:
255 / 16 = 15, остаток 15 → F
15 / 16 = 0, остаток 15 → F
Итог: 255 = 0xFFHex в двоичную
Каждая hex-цифра независимо переводится в 4 двоичных разряда. Это самая простая конвертация:
0x2A:
2 = 0010
A = 1010
→ 00101010Hex и текст
Любой текст можно представить в hex, закодировав каждый байт. Например, слово «Hello» в ASCII:
H = 0x48
e = 0x65
l = 0x6C
l = 0x6C
o = 0x6F
"Hello" → "48656C6C6F"Кириллица в UTF-8 занимает по два байта на букву. Например, «Привет»:
"Привет" → "D09FD180D0B8D0B2D0B5D182"Hex в разных языках программирования
JavaScript
// Строка в hex
function textToHex(text) {
const bytes = new TextEncoder().encode(text);
return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
}
textToHex('Hello'); // "48656c6c6f"
textToHex('Привет'); // "d09fd180d0b8d0b2d0b5d182"
// Hex в строку
function hexToText(hex) {
const bytes = new Uint8Array(hex.match(/.{2}/g).map(h => parseInt(h, 16)));
return new TextDecoder().decode(bytes);
}
hexToText('48656c6c6f'); // "Hello"
// Числа в hex и обратно
(255).toString(16); // "ff"
parseInt('ff', 16); // 255
0xFF; // 255Python
# Строка в hex
text = 'Hello'
hex_str = text.encode('utf-8').hex()
# '48656c6c6f'
# Hex в строку
bytes.fromhex('48656c6c6f').decode('utf-8')
# 'Hello'
# Числа
hex(255) # '0xff'
int('ff', 16) # 255
0xFF # 255PHP
<?php
// Строка в hex
$hex = bin2hex('Hello'); // "48656c6c6f"
// Hex в строку
$str = hex2bin('48656c6c6f'); // "Hello"
// Числа
dechex(255); // "ff"
hexdec('ff'); // 255Hex dump: что показывает и зачем нужен
Hex dump — это представление бинарных данных в виде таблицы с тремя колонками: смещение (адрес), hex-байты и ASCII-представление. Для непечатных символов в ASCII-колонке показывается точка. Это незаменимый инструмент при:
- анализе неизвестных бинарных форматов;
- поиске сигнатур файлов (magic numbers);
- отладке сетевых пакетов;
- восстановлении удалённых файлов;
- изучении прошивок и исполняемых файлов.
Первые байты файла часто определяют его формат — это называется «magic number». Например:
| Hex-сигнатура | Формат |
|---|---|
| FF D8 FF | JPEG |
| 89 50 4E 47 | PNG |
| 47 49 46 38 | GIF |
| 25 50 44 46 | |
| 50 4B 03 04 | ZIP |
| 1F 8B | GZIP |
| 4D 5A | Windows EXE |
| 7F 45 4C 46 | Linux ELF |
Эти сигнатуры используют файловые менеджеры и антивирусы для определения типа файла по содержимому, а не по расширению.
Hex и Base64: сравнение
Hex и Base64 — два популярных способа представить бинарные данные как текст. У каждого свои плюсы:
| Свойство | Hex | Base64 |
|---|---|---|
| Алфавит | 16 символов (0-9, A-F) | 64 символа (A-Z, a-z, 0-9, +, /) |
| Размер данных | ×2 от исходного | ×1.33 от исходного |
| Читаемость байтов | Отличная: 2 символа = 1 байт | Сложная: 4 символа = 3 байта |
| Использование в URL | Безопасно | Нужен Base64url или кодирование |
| Типичное применение | Цвета, MAC, хеши, dump | Email, Data URI, JWT, API |
Если важна компактность — выбирайте Base64. Если нужно легко читать отдельные байты или работать с битами — hex удобнее. Подробнее о сравнении методов кодирования читайте в нашей статье о сравнении кодировок.
Распространённые ошибки
1. Пропущенный ведущий ноль
Каждый байт должен записываться двумя hex-цифрами. Если записать 0xF вместо0x0F, при декодировании строка «сожмётся» и сместятся все последующие байты. В JavaScript и Python используйте padStart(2, '0') или форматирование.
2. Путаница регистра
Hex нечувствителен к регистру: 0xFF и 0xff — одно и то же. Но разные библиотеки и стандарты могут предпочитать тот или иной регистр. В CSS традиционно используют верхний регистр, в URL — нижний.
3. Смешивание строк и чисел
0xFF как число — это 255. "0xFF" как строка — это четыре символа. Не путайте их при сериализации и парсинге.
4. Забытый префикс 0x
В большинстве языков 0xFF — это hex-число, а FF — это идентификатор переменной. Если вы передаёте hex как строку в parseInt, префикс 0x можно опустить, указав основание 16.
Заключение
Шестнадцатеричная система — компактный и удобный способ записать бинарные данные. Hex используется везде: от цветов в CSS до хешей и MAC-адресов. Главное преимущество — каждый байт занимает ровно два символа, что делает hex идеальным для отладки и анализа бинарных данных. Если вам нужно представление ещё компактнее — используйте Base64.
Для практической работы у нас есть удобные инструменты: Hex в RGB конвертер и текст в hex. А если хотите сравнить hex с другими способами кодирования — загляните в наш сравнительный обзор.
Попробуйте эти инструменты
Похожие статьи
Base64 — что это и как работает
Принцип кодирования Base64, алфавит, padding, использование в Data URI, email, API. Примеры кодирования.
URL кодирование: percent-encoding explained
Что такое URL encoding, зарезервированные символы, как кодировать/декодировать URL, частые ошибки.
HTML сущности и кодирование спецсимволов
HTML entities, named vs numeric, XSS защита, кодирование кавычек, амперсандов, угловых скобок.
JWT токен: структура и как декодировать
JSON Web Token: header, payload, signature. Как работает аутентификация JWT, безопасность, декодирование.