Все статьи
Кодирование

Hex (шестнадцатеричное) кодирование: гид

Что такое hex, цветовые коды, hex dump, использование в программировании и отладке.

20 февраля 2025
6 мин чтения
ConvertHub
#hex#hexadecimal#цвета

Введение

Шестнадцатеричная система счисления, или 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Двоичная
000000
110001
220010
330011
440100
550101
660110
770111
881000
991001
10A1010
11B1011
12C1100
13D1101
14E1110
15F1111

Поскольку один 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!.|
0000000e

6. 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 = 0xFF

Hex в двоичную

Каждая hex-цифра независимо переводится в 4 двоичных разряда. Это самая простая конвертация:

0x2A:
  2 = 0010
  A = 1010
  → 00101010

Hex и текст

Любой текст можно представить в 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;                   // 255

Python

# Строка в 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            # 255

PHP

<?php
// Строка в hex
$hex = bin2hex('Hello');  // "48656c6c6f"

// Hex в строку
$str = hex2bin('48656c6c6f');  // "Hello"

// Числа
dechex(255);  // "ff"
hexdec('ff'); // 255

Hex dump: что показывает и зачем нужен

Hex dump — это представление бинарных данных в виде таблицы с тремя колонками: смещение (адрес), hex-байты и ASCII-представление. Для непечатных символов в ASCII-колонке показывается точка. Это незаменимый инструмент при:

  • анализе неизвестных бинарных форматов;
  • поиске сигнатур файлов (magic numbers);
  • отладке сетевых пакетов;
  • восстановлении удалённых файлов;
  • изучении прошивок и исполняемых файлов.

Первые байты файла часто определяют его формат — это называется «magic number». Например:

Hex-сигнатураФормат
FF D8 FFJPEG
89 50 4E 47PNG
47 49 46 38GIF
25 50 44 46PDF
50 4B 03 04ZIP
1F 8BGZIP
4D 5AWindows EXE
7F 45 4C 46Linux ELF

Эти сигнатуры используют файловые менеджеры и антивирусы для определения типа файла по содержимому, а не по расширению.

Hex и Base64: сравнение

Hex и Base64 — два популярных способа представить бинарные данные как текст. У каждого свои плюсы:

СвойствоHexBase64
Алфавит16 символов (0-9, A-F)64 символа (A-Z, a-z, 0-9, +, /)
Размер данных×2 от исходного×1.33 от исходного
Читаемость байтовОтличная: 2 символа = 1 байтСложная: 4 символа = 3 байта
Использование в URLБезопасноНужен Base64url или кодирование
Типичное применениеЦвета, MAC, хеши, dumpEmail, 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 с другими способами кодирования — загляните в наш сравнительный обзор.

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

Похожие статьи