Текст в шестнадцатеричный код: в каком виде байты попадают в трассировку
Что делает эта конвертация
Инструмент кодирует текст в UTF-8 и печатает каждый байт двумя шестнадцатеричными цифрами. Это нотация перехватов пакетов, просмотрщиков памяти и журналов протоколов, поэтому конвертация на деле переводит то, что человек набирает, в то, что показывают его инструменты.
Две цифры на байт, всегда
Байт хранит значения от 0 до 255, и две шестнадцатеричные цифры покрывают ровно этот диапазон — от 00 до FF. Соответствие никогда не меняется, и именно поэтому дамп читается глазами: байты можно считать парами, а столбец смещений слева подсказывает, на какую пару вы смотрите. Строка из восьми символов даёт восемь пар, и ни один символ не может дать половину пары.
Таблица перевода текста в шестнадцатеричный код
Короткие строки и их шестнадцатеричные байтовые значения. Пунктуация и цифры превращаются в свои значения ASCII одной парой, а всё, что выходит за пределы латиницы, разворачивается в несколько пар.
| Текст | Шестнадцатеричная |
|---|---|
| A | 41 |
| Hi | 48 69 |
| OK | 4F 4B |
| 123 | 31 32 33 |
| ! | 21 |
| Go | 47 6F |
Как найти строку внутри трассировки
Искать в перехвате пакетов читаемый текст обычно бесполезно: по проводу идут байты, а вы набрали символы. Перевод искомой строки в шестнадцатеричный вид даёт точную последовательность для поиска и объясняет, почему поиск имени с диакритикой не находит ничего, пока тот же поиск без неё срабатывает: у закодированных форм разная длина, а не просто разные символы.
Учитывайте разделители
Инструмент разделяет байты пробелами для наглядности, тогда как многие перехваты и URL пишут цифры слитно или через знак процента. При поиске уберите пробелы или замените их тем разделителем, которого ждёт ваш инструмент: последовательность, выглядящая одинаково, может не совпасть только из-за промежутков.
Частые вопросы
Как перевести текст в шестнадцатеричный код вручную?
Найдите для каждого символа его байтовое значение в UTF-8 и запишите его двумя шестнадцатеричными цифрами. Для «Hi» это 48 и 69. Для символов за пределами ASCII нужны именно байтовые значения, а не коды символов, поскольку один символ может занимать несколько байтов.
Чем шестнадцатеричный вывод отличается от двоичного?
Ничем, кроме записи. Оба кодируют одни и те же байты UTF-8: шестнадцатеричный пишет каждый байт двумя цифрами, двоичный — восемью, поэтому первый в четыре раза короче и гораздо легче читается. Выбирайте шестнадцатеричный для чтения, а двоичный — когда нужно видеть отдельные биты.
Почему буква с диакритикой занимает два байта?
Потому что UTF-8 кодирует всё, что выше исходного диапазона ASCII, более чем одним байтом, и большинству латинских букв с диакритикой хватает двух. Это нормально и не является порчей: символ просто вышел за пределы, которые адресует один байт, и любой счётчик байтов увидит два.
Это та же кодировка, что используется в URL?
Родственная, но не та же. Процентное кодирование записывает байты UTF-8 со знаком процента перед каждой парой, поэтому байтовые значения в точности совпадают с этим инструментом, а различается только пунктуация. Перевод в шестнадцатеричный вид здесь и даёт те байты, которые нужно закодировать процентами.
Можно использовать вывод в литерале массива байтов?
Да. Цифры и есть значения байтов, поэтому добавление префикса 0x к каждой паре даёт литерал почти для любого языка программирования. Инструмент по соглашению печатает заглавными; строчные столь же допустимы там, куда вы это вставите.