Як працює hex-кодування
Кожен символ на сторінці зберігається як один або більше байтів. Hex-кодування переписує ці байти у шістнадцятковій системі, два символи на байт, щоб потік байтів був читабельним без спеціальних інструментів.
- Кодування тексту у байти. Режим UTF-8 запускає введення через
new TextEncoder().encode(text), що повертаєUint8Arrayзначень байтів. Режим Latin-1 бере молодші вісім бітів кожної кодової одиниці черезcharCodeAt(0) & 0xFF, що є перетворенням, яке виконують застарілі кодеки ISO-8859-1. - Відображення кожного байта у два hex-символи. Кожен байт відображається у два hex-символи через
byte.toString(16).padStart(2, "0"). Перемикач регістру вибирає верхній регістр (A-F) або нижній регістр (a-f) для вихідних літер. - Застосування групування та префіксу. Групування вставляє роздільник між байтами: одиночний пробіл, тире або пробіл кожні чотири байти. Префікс 0x можна додавати один раз до всього рядка (без групування) або для кожного байта (з пробільним групуванням), відповідно до умов, яких очікують масиви C та інструменти двійкового diff.
- Зворотнє декодування. Режим Hex → Текст видаляє кожен пробіл, тире та префікс
0xз введення, перевіряє символи, що залишилися, відносно/^[0-9a-fA-F]+$/, відхиляє рядки з непарною довжиною та відновлюєUint8Arrayз послідовних пар байтів. Режим UTF-8 декодує цей масив за допомогоюnew TextDecoder("utf-8", { fatal: true }); режим Latin-1 відображає кожен байт наString.fromCharCode(b). - Живий режим для швидкої ітерації. Живий режим увімкнено за замовчуванням. Кожне натискання клавіші планує повторну конвертацію з затримкою 150 мс, щоб ви могли вставити, відредагувати та спостерігати за оновленням іншої панелі без натискання кнопки Конвертувати.
Навіщо використовувати конвертер hex
- Налагодження двійкових протоколів. Дротові формати, як-от Modbus, DNP3 та CoAP, пакують свої заголовки у конкретні зміщення байтів. Читання захопленого кадру як hex показує кожне поле з першого погляду, а перетворення тих самих байтів назад у ASCII виявляє будь-яке текстове корисне навантаження, що знаходиться поряд з двійковим обрамленням.
- Робота з вбудованим мікропрограмним забезпеченням. JTAG та SWD-зонди повідомляють вміст пам'яті як hex. Переведення ділянки пам'яті в ASCII виявляє вбудовані рядки (шляхи до файлів, повідомлення про помилки, підписи постачальників), які часто вказують, де саме у мікропрограмному забезпеченні ви знаходитеся.
- Читання захоплень пакетів. Wireshark та tcpdump обидва мають байтову панель, що виводить кожен пакет як hex зліва та ASCII справа. Конвертація фрагмента тут дозволяє скопіювати hex-блоб зі звіту про помилку або журналу чату та прочитати, що насправді кажуть байти, без повторного їх імпорту до інструменту захоплення.
- Порівняння на рівні байтів. Порівняння двох двійкових файлів часто зводиться до виявлення змінених байтів. Конвертація обох сторін в hex з послідовним групуванням вирівнює diff у текстовому редакторі, де вбудований інструмент diff може виділити змінені байти.
Поширені застосування
Конвертація hex ↔ ASCII зустрічається у реверс-інжинірингу, безпеці та вбудованих розробках щоразу, коли потік байтів є більшим за просте текстове корисне навантаження.
- Реверс-інжиніринг: візьміть hex-дамп з резистентного до рядків двійкового файлу, виберіть послідовності, що декодуються як ASCII, що друкується, та використовуйте ці рядки для визначення місця у дизасемблері.
- Мережева криміналістика: скопіюйте корисне навантаження одного пакета з Wireshark як hex, вставте сюди та прочитайте текст прикладного рівня без експорту всього захоплення.
- Обробка криптографічного матеріалу: ключ, IV або тег HMAC часто передається як hex-рядок. Декодування назад у байти підтверджує, що довжина відповідає алгоритму (16 байтів для AES-128, 32 для AES-256) перед тим, як вставити його до конфігурації.
Практичний приклад
Виберіть Текст → Hex, UTF-8, нижній регістр, групування Пробіл після кожного байта, префікс вимк. Введіть Hi: виведення читається як 48 69. Увімкніть префікс та змініть групування на Без групування — те саме введення відображається як 0x4869. Вставте емоджі 😀 як введення, і режим UTF-8 виводить f0 9f 98 80 — чотири байти для однієї кодової точки, тому емоджі часто збільшують розмір при передачі. Перейдіть у Hex → Текст та вставте 0x48-65-6C 6C 6F: парсер видаляє префікс, тире та пробіли та відновлює Hello.
FAQ
Що таке hex-кодування?
Hex-кодування (або шістнадцяткове кодування) записує потік байтів у шістнадцятковій системі, два ASCII-символи на байт. Кожна hex-цифра охоплює чотири біти, тому дві цифри охоплюють один восьмибітний байт. Алфавіт йде від 0-9 до A-F (або a-f); регістр є суто презентаційним вибором, і декодери приймають обидва. Hex є стандартним способом запису необроблених байтів у специфікаціях протоколів, виведенні відладчика та криптографічних ключах, оскільки він вдвічі компактніший за двійковий та уникає проблем із недрукованими символами необроблених байтів у тексті.
Чому мій емоджі стає 4 байтами у hex?
UTF-8 — це кодування змінної довжини. ASCII-символи (U+0000 до U+007F) займають один байт, доповнення Latin-1 займають два, більшість інших кодових точок BMP займають три, а символи вище U+FFFF — включаючи більшість емоджі — займають чотири. Усміхнене обличчя 😀 — це U+1F600 і кодується як F0 9F 98 80. Якщо вам потрібний вигляд з фіксованою шириною байта, перейдіть на Latin-1 — але Latin-1 охоплює лише перші 256 кодових точок, тому будь-який символ поза цим діапазоном не може зберегтися при зворотному перетворенні.
Чи підтримується Latin-1 / ISO-8859-1?
Так. Перемкніть параметр Кодування тексту на Latin-1 (ISO-8859-1). Кодування бере молодші вісім бітів кожної кодової одиниці JavaScript (charCodeAt(0) & 0xFF), що відповідає застарілому однобайтовому відображенню. Декодування використовує String.fromCharCode(byte) для кожного байта. Використовуйте Latin-1 при роботі з виведенням від старіших систем Windows-1252 або довнікодових систем, де кожен байт відповідає рівно одному символу.
Чи виконується конвертація у моєму браузері?
Так. Конвертер запускає TextEncoder, TextDecoder та невеликий парсер як єдину статичну сторінку. Немає завантаження, немає API-виклику та немає аналітики того, що ви вставляєте — лише стандартні метрики завантаження сторінки, спільні для всього сайту. Ті самі hex-байти, що ви бачите тут, є тим, що скрипт Node або функція Lambda видали б для того самого введення.
Конвертація hex ↔ ASCII — це невелике завдання, яке виконують декілька разів на день всі, хто читає двійкові протоколи або вбудоване мікропрограмне забезпечення. Виконання цього у вкладці браузера, з тими самими нативними кодерами, які вже постачаються з Node і V8, робить роботу швидкою, а потік байтів залишається на вашому комп'ютері.