Слишком часто я вижу, что почти все hex-редакторы выглядят так:

Каждый раз, когда я открываю их, мне становится жаль бедного человека, которому приходится пользоваться этим (особенно, если этот человек - я!). Простой список байтов затрудняет поиск важных или интересных вещей среди массива данных. давайте, попробуйте найти в этих байтах единичный c0:

Но стоит подсветить байты:

И становится гораздо проще выделить уникальный байт, если он другого цвета! Человеческий мозг действительно хорош в распознавании визуальных образов — при условии правильного формата
Вот еще несколько примеров:


Этот файл начинается с магических байт KPS, за которыми следует набор 32-разрядных целых чисел (little-endian) в диапазоне от 0 до 999 (0x3e7). Цвета позволяют быстро распознать, что каждое 32-разрядное целое число относительно маленькое, поскольку два старших байта всегда равны 00 00. Если присмотреться, можно заметить и другие закономерности, например, цифры, отсчитывающие каждые 0x18 байт, начиная с 0xс
Если вам интересен этот конкретный формат файла, то код, который его парсит, довольно прост, даже если вы не программист. Есть даже вики-страница с представляемыми данными, если вам нравятся Fossil Fighters.
Перейдем ко второму примеру.


Этот фрагмент, начинающийся с 0x14, содержит длинный ряд увеличивающихся 32-разрядных целых чисел (снова little-endian). Каждое из них является индексом к более поздней точке файла, к структуре, обычно длиной около 0x3c байт. примерно равномерно расположенные индексы создают очень красивые радужные градиенты.
Третий пример:


Эти данные сжимаются с использованием алгоритма Хаффмана, в частности, кода, совместимого с Nintendo DS BIOS. сначала кодируется 0x20 байт используемого дерева Хаффмана, затем 0x90 байт сжатого битового потока — фактического содержимого сжатого файла.
Между этими двумя частями есть большая разница, которую трудно заметить без помощи цветов. Дерево в основном содержит байты в диапазоне 00-0f (плюс несколько нижних 80 и c0), но в битовом потоке байты равномерно распределены по всему диапазону 00-ff.
Битовый поток гораздо более красочный и хаотичный, потому что хорошие алгоритмы сжатия выводят данные, которые визуально выглядят случайными. В идеале, любые закономерности, которые вы заметили бы в данных, должны были в свою очередь замечены алгоритмом, а затем использованы для уменьшения размера сжатых выходных данных.
Пример 4:


Этот заключительный пример взят из растровых данных для следующего изображения:

Как и все другие примеры, он взят из игры Fossil Fighters для Nintendo DS, а именно из спрайта ямы, которую игрок делает, выкапывая окаменелости:

Поскольку в растровом изображении используются 4-битные цветовые индексы, каждая цифра hex-кода кодирует ровно один пиксель изображения. я думаю, что результат в основном говорит сам за себя, но стоит отметить выделение в правом нижнем углу отверстия. В обычном шестиугольнике вы, возможно, и сможете различить общую форму отверстия, особенно если посмотрите на ascii-панель справа, но с помощью цвета вы сможете рассмотреть невероятное количество деталей!
Какие цвета лучше всего подходят?
Если вы раньше использовали HEX-редактор с подсветкой байтов, вы, возможно, заметили что-то необычное в том, как я выбираю цветовое кодирование байтов
В большинстве цветных шестнадцатеричных редакторов есть несколько категорий, по которым они сортируют байты, например, 00 байт, формат ASCII для печати, пробелы ASCII, другие ASCII, не-ASCII или ff-байты.
Например, hexyl по умолчанию использует следующие категории:

Которые в конечном итоге выглядят примерно так:

Этих обширных категорий достаточно, чтобы выделить общие шаблоны, такие как повторяющиеся нулевые байты и строки ASCII. Они также создают достаточно вариативности для визуального отслеживания при прокрутке, что, на мой взгляд, весьма полезно. Прокрутка полностью монохромного hex-файла может дезориентировать.
я, однако, иду дальше, и у меня всего 18 групп: по одной для каждого ведущего ниббла (`0X`, 1X, 2X …), плюс две дополнительные для 00 и выше:

Наличие большего количество цветов позволяет распознавать более сложные паттерны, такие как смещения по возрастанию в примере 2 или различные разделы в примере 3. Текст в формате ASCII по-прежнему узнаваем, но вместо сплошного голубого он окрашен в различные оттенки зеленого и оранжевого:


С другой стороны, UTF-8, отличный от ASCII, выглядит совершенно по-другому, со своим собственным уникальным паттерном, который виден только при наличии большого количества цветовых групп:


Можно привести еще миллион примеров, таких как отрицательные числа в two’s complement («дополнительный код») (bd ff ff ff ff), машинный код, зашифрованные данные, цветовые палитры, матрицы преобразования и так далее, но, надеюсь, приведенных мной достаточно, чтобы донести свою точку зрения.
Красочный вывод в hex формате полезен по той же причине, что и подсветка синтаксиса в коде: он использует мощные возможности нашего мозга по распознаванию визуальных образов. Он позволяет нам замечать детали в данных так же быстро, как мы замечаем детали в окружающей нас среде. Байты с подсветкой должны быть так же распространены в hex-редакторах, как подсветка синтаксиса в современных редакторах кода.
Что можно использовать?
Существует множество инструментов, использующих подсветку, вот некоторые из них, о которых я знаю:
Утилиты для HEX-просмотра:
hexyl — категории байтов по умолчанию, опция градиента;
xcd-rgb — полная радужная байтовая раскраска;
hevi — использует цвета для обозначения разделов для определенных типов файлов;
xxd— параметр для категорий байтов по умолчанию отключен.
HEX-редакторы:
Hexerator — полная радужная раскраска байтов и множество других функций;
REHex — несколько вариантов цвета (включая пользовательский), по умолчанию отключены;
Hex Fiend — опция для категорий байтов по умолчанию отключена; пользовательские цвета, если вы готовы работать над этим.
Если вы знаете другие хорошие инструменты, пожалуйста, дайте мне знать! Если вы работаете с любыми инструментами, которые отображают hex-данные, я настоятельно рекомендую добавить цвета, в идеале с большим количеством групп (не стесняйтесь копировать мои!). По крайней мере, сделать 00 более незаметными, чем другие байты, чрезвычайно полезно
Основная цель этой статьи — привлечь внимание к тому, что эта функция существует. Она предоставляет множество полезных фишек практически без каких-либо недостатков, и о ней должно знать как можно больше людей. Если вы хотите отправить Issue/PR на добавление подсветки для инструмента, который вы используете чаще всего, я надеюсь, что эта статья послужит объяснением того, почему ее стоит добавить
Во время написания этой статьи я фактически начала создавать свой собственный пользовательский шестнадцатеричный редактор под названием hexapoda >_<. он вдохновлен, в частности, Helix и Teehee, модальным редактированием, несколькими курсорами и операциями выделения (написан на Rust с использованием Ratatui!). Если достаточное количество людей захотят, я могла бы доработать его и написать несколько документов, чтобы любой мог им пользоваться, но пока это только для меня :3
Прим. редактора: мне понравилась эта статья, так что вдохновившись ей я написал туториал по созданию hex-редактора на Python+curses.
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩

Комментарии (3)

john_crew
02.06.2026 11:01Так-то hex-редактор должен уметь различать контекст. Если это картинка, то каждый пиксель рендерить в своём цвете - это прикольно, на мой взгляд. Но как быть, если обычный текстовый файл начинается как бинарный с байтов MZP/ELF?
Лично для меня, Dos Navigator остаётся самым магическим hex-редактором. В режиме просмотра можно войти в режим hex-редактирования и править бинарники не парясь за чек-сумму.

StreamThread
02.06.2026 11:01Подобная подсветка может быть не очень совместима с классическим способом разбора, при котором байты помечаются цветом. Не все Hex редакторы поддерживают скрипты с удобным отображением структур.
vilgeforce
Начнем с того, что HEX-редактор должен показывать разные символы для разных байтов, чего на ваших скринах нет. А уж задача поиска - ну F7 и поехали искать :-D