HEX — Hexadecimal Source File
Файлы с расширением HEX содержат различную информацию, сохраненную в шестнадцатеричном формате. Такие сведения включают настройки и конфигурации, а также другие типы данных. Файлы HEX используются многими компиляторами. Исходный код программы преобразуется в машинный код с помощью именно таких компиляторов, в результате чего и происходит создание файла HEX.
Файлы HEX используются целым рядом программ. Они могут сохраняться в текстовом формате, что позволяет открывать их любой программой редактирования текста. Однако некоторые HEX-файлы сохраняются в двоичном формате. В этом случае для открытия и просмотра содержимого файлов необходима специальная программа редактирования шестнадцатеричных файлов. Строка текста, сохраненная в файле HEX, содержит шесть полей. Такие строки состоят из стартовых кодов, количества байтов, адреса, типа записи, данных и контрольной суммы.
Вот небольшой, но неполный список программ, которые могут открывать документы HEX:
Формат файлов *.hex
Многие наверняка замечали, что большинство файлов прошивок для различных контроллеров, процессоров, микросхем памяти и прочих подобных вещей хранится либо в бинарных файлах, в которых информация записана именно в том виде и в том порядке, в котором она записана в памяти железки (т.е. это тупо дамп памяти), либо в файлах с расширением hex. Вот в этой статье мы и расскажем о том, что же это за формат и зачем он вообще нужен.
Для начала разберёмся — чем же оказались неудобны бинарники? Во-первых, в таблице ASCII некоторым кодам соответствуют непечатные символы, соответственно, бинарный файл не может быть целиком просмотрен или распечатан в текстовом режиме. Во-вторых, прошивка редко занимает целиком всю память железки, а бинарник — это, как уже было сказано выше, дамп памяти целиком. И ладно, если бы вся полезная информация всегда располагалась, например, в начале файла, пустое окончание можно было бы от бинарника просто отрезать. Но нет, чаще всего информация в бинарнике расположена не одним куском, а находится в различных частях файла и между кусками с полезной информацией расположены пустые места, которые и хранить и распечатывать особого смысла нет.
Почесав репу над этими двумя недоразумениями, джедаи из Intel придумали формат hex или Intel-hex, ставший впоследствии стандартом де-факто для записи всяких разных прошивок. Мне больше нравится говорить Intel-hex, поскольку в этом случае не возникает путаницы и сразу понятно, что речь идёт об информации в файлах *.hex, а не просто о представлении данных в шестнадцатиричном виде. Ну ладно, вернёмся к проблемам Intel и к их решению.
Проблему с непечатными символами решили очень просто, — в Intel-hex формате двоичные данные, представленные в шестнадцатиричном виде, записываются символами ASCII. Например, число «00111111» в шестнадцатиричном виде равно «3F» и в формате Intel-hex будет записано двумя символами: «3» и «F».
Не на много сложнее оказалось и решение проблемы с пустыми местами. В *.hex файлы решили писать не всё подряд, а только полезные данные (т.е. пустые места бинарника решили не писать). Но в этом случае нужно было кроме самих данных ещё и как-то указывать адреса, по которым эти данные расположены. Окей, стали писать ещё и адреса.
Далее добавили ещё данные о точке входа, ну чтоб можно было записанную таким образом программку сразу и исполнять, и придумали разбивать всю информацию на специальные блоки, называемые «записями», чтоб отличить где что записано: где данные, где адреса, где точки входа. Вот, собственно, из этих записей и состоит весь *.hex файл.
Записи бывают следующих типов:
- Data Record (данные); для всех форматов данных
- End of File Record (конец файла); для всех форматов данных
- Extended Segment Address Record (расширенный адрес сегмента); для 16- или 32-битного форматов данных
- Start Segment Address Record (начальный адрес сегмента); для 16- или 32-битного форматов данных
- Extended Linear Address Record (расширенный линейный адрес); только 32-битного формата данных
- Start Linear Address Record (начальный линейный адрес); только для 32-битного формата данных
Все записи имеют следующий формат:
| RECORD MARK ‘:’ |
RECLEN | LOAD OFFSET | RECTYPE | INFO or DATA | CHKSUM |
| 1 byte | 2 bytes | 1 byte | n bytes | 1 byte | |
| 1 ASCII | 2 ASCII | 4 ASCII | 2 ASCII | 2*n ASCII | 2 ASCII |
В данном случае:
- RECORD MARK — метка начала записи, всегда ‘:’ (в шестнадцатиричном виде 3Ah)
- RECLEN — число байт информации или данных, следующих за полем RECTYPE. Помните, что в Intel-hex формате один байт данных записывается двумя символами ASCII. Максимальное значение этого поля — ‘FF’ (в шестнадцатиричном виде 4646h)
- LOAD OFFSET — 16-ти битное начальное смещение данных. Поскольку это поле используется только в записях данных, то в остальных записях оно кодируется как четыре ASCII символа нуля (‘0000’ или в шестнадцатиричном виде 30303030h)
- RECTYPE — поле, определяющее тип записи. Может принимать следующие значения:
- ’00’ — Data Record
- ’01’ — End of File Record
- ’02’ — Extended Segment Address Record
- ’03’ — Start Segment Address Record
- ’04’ — Extended Linear Address Record
- ’05’ — Start Linear Address Record
А теперь о некоторых типах записей подробнее:
Extended Linear Address Record RECORD MARK RECLEN LOAD OFFSET RECTYPE ULBA CHKSUM ‘:’ ’02’ ‘0000’ ’04’ 2 bytes 1 byte Эта запись используется в 32-битных прошивках для определения битов 16-31 линейного базового адреса (LBA), при этом биты 0-15 равны нулю. Сами биты 16-31 называются верхним базовым адресом (ULBA).
Абсолютное значение адреса байта данных в памяти получается добавлением LBA к смещению, вычисленному сложением поля LOAD OFFSET в последующих записях данных и индекса байта в поле DATA этих записей. Все суммирования делаются по модулю 4G, таким образом мы получаем циклический (от FFFFFFFFh происходит переход к 00000000h) 4-х гигабитный (4G=2 32 ) линейный адрес (Linear Address).
ByteAddr=(LBA+DRLO+DRI) mod 4G, где
DRLO — значение поля LOAD OFFSET в записи данных
DRI — индекс байта в поле DATA записи данных
Когда запись «Extended Linear Address» встречается в файле, — заданный с помощью неё линейный базовый адрес (LBA) действует для всех последующих записей данных, пока не встретится новая запись «Extended Linear Address». По умолчанию LBA=00000000h.
Extended Segment Address Record RECORD MARK RECLEN LOAD OFFSET RECTYPE USBA CHKSUM ‘:’ ’02’ ‘0000’ ’02’ 2 bytes 1 byte Эта запись используется для определения битов 4-19 базового адреса сегмента (SBA), при этом биты 0-3 равны нулю. Сами биты 4-19 называются верхним адресом сегмента (USBA).
Абсолютное значение адреса байта данных в памяти получается добавлением SBA к смещению, вычисленному сложением поля LOAD OFFSET в последующих записях данных и индекса байта в поле DATA этих записей. Сложение LOAD OFFSET и индекса выполняется по модулю 64K, таким образом мы получаем циклический (от смещения FFFFh происходит переход к 0000h) 64-х килобитный (64K=2 16 ) адрес в заданном сегменте.
ByteAddr=SBA+[(DRLO+DRI) mod 64K], где
DRLO — значение поля LOAD OFFSET в записи данных
DRI — индекс байта в поле DATA записи данных
Когда запись «Extended Segment Address» встречается в файле, — заданный с помощью неё базовый адрес сегмента (SBA) действует для всех последующих записей данных, пока не встретится новая запись «Extended Segment Address». По умолчанию базовый адрес сегмента (SBA) равен нулю.
Start Linear Address Record RECORD MARK RECLEN LOAD OFFSET RECTYPE EIP CHKSUM ‘:’ ’04’ ‘0000’ ’05’ 4 bytes 1 byte Эта запись используется для указания адреса, с которого начинается исполнение объектного файла. Значение поля EIP определяет адрес, который заносится в регистр EIP процессора. Отметим, что эта запись определяет только адрес точки старта кода в пределах 32-х битного линейного адресного пространства защищённого режима процессора 80386. В реальном режиме для определения точки старта должна использоваться запись Start Segment Address Record, поскольку она описывает содержимое пары регистров CS:IP, необходимое для реального режима.
Запись «Start Linear Address» может быть расположена в любом месте файла, если же такой записи нет, то загрузчик использует адрес старта по умолчанию.
Start Segment Address Record RECORD MARK RECLEN LOAD OFFSET RECTYPE CS:IP CHKSUM ‘:’ ’04’ ‘0000’ ’03’ 4 bytes 1 byte Эта запись используется для указания адреса, с которого начинается исполнение объектного файла. Значение поля CS:IP определяет 20-ти битный адрес, заносимый в регистры CS:IP процессора. Отметим, что эта запись определяет только адрес входа в 20-ти битном сегментированном адресном пространстве процессоров 8086/80186.
Запись «Start Segment Address» может быть расположена в любом месте файла, если же такой записи нет, то загрузчик использует адрес старта по умолчанию.
Файл hex что это
В этой статье приведен перевод документа компании Intel «Hexadecimal Object File Format Specification» — описание широко распространенного текстового формата файла для хранения двоичных данных (формат Intel HEX). В тексте часто встречается термин «Шестнадцатеричный объектный файл», который на самом деле соответствует просто какой-то прошивке микроконтроллера (например, файл firmware микроконтроллера AVR, имеющий расширение HEX), т. е. имеется в виду просто сам HEX-файл.
[Введение]
Этот документ описывает формат шестнадцатеричного объектного файла для 8-, 16- и 32-битных микропроцессоров Intel. Шестнадцатеричный формат подходит для входных данных программаторов PROM или аппаратных эмуляторов.
Примечание переводчика: поскольку формат Intel HEX давно стал стандартном де-факто, он применяется для хранения данных и кода почти для всех без исключения встраиваемых (embedded) архитектур микроконтроллеров и процессоров, не только для процессоров Intel x86.
Шестнадцатеричный формат объектного файла — способ представления абсолютного двоичного объектного файла в символах ASCII. Поскольку файл кодируется только символами ASCII вместо двоичных байт, то становится возможным хранить файл на недвоичном носителе, таком как бумажная перфолента (paper-tape), перфокарты (punch cards) и т. д.; HEX-файл можно также легко отобразить на экране CRT терминала, принтере и т. п. 8-битный шестнадцатеричный формат объектного файла позволяет размещение кода и данных в пределах линейного 16-битного адресного пространства 8-битных процессоров Intel. 16-битный шестнадцатеричный формат позволяет использовать 20-битное сегментированное адресное пространство 16-битных процессоров Intel. И 32-битный формат позволяет применять линейное 32-битное адресное пространство 32-битных процессоров Intel.
Примечание переводчика: 8-, 16- и 32-битные форматы отличаются друг от друга только логической структурой, т. е. появлением в HEX-файле различных типов записей (типы записей см. далее). Общий формат HEX-файла и кодирование записей в нем при этом остается неизменными.
Шестнадцатеричное представление двоичного файла закодировано с помощью цифробуквенных символов ASCII. Например, 8-битное двоичное значение 00111111 соответствует шестнадцатеричному 3F. Чтобы закодировать это значение в ASCII, применяется 2 байта символов ASCII. Первый байт для нашего примера кодирования будет равен ASCII-символу ‘3’ (в двоичном виде это 00110011 или 033H) и второй байт будет равен ASCII-символу ‘F’ (01000110 или 046H). Для каждого значения байта порядок следования шестнадцатеричных цифр всегда такой, что старшая цифра идет первой. ASCII-представление двоичного кода всегда требует в 2 раза больше байт данных, чем двоичное представление данных.
Шестнадцатеричный объектный файл разбит на блоки записей (строки), каждая из которых содержит тип записи, длину, адрес загрузки в память и дополнительную контрольную сумму. Здесь заданы шесть (6) различных типов записей, однако не все типы записей имеют важное значение для каждого конкретного случая. Вот эти типы записей:
· Data Record, запись для данных (8-, 16- или 32-bit форматы)
· End of File Record, запись для сигнала о конце файла (8-, 16- или 32-bit форматы)
· Extended Segment Address Record, запись для адреса расширенного сегмента (16- или 32-bit форматы)
· Start Segment Address Record, запись для начала сегмента (16- или 32-bit форматы)
· Extended Linear Address Record, запись для расширенного линейного адреса (только 32-bit формат)
· Start Linear Address Record, запись для начала линейного адреса (только 32-bit формат)На рисунке показан пример содержимого HEX-файла.
Примечание переводчика: для каждой отдельной архитектуры процессора могут понадобиться далеко не все записи. К примеру, для микроконтроллеров AVR реально используются только типы записей Data Record и End of File Record. Линкер GCC также добавляет в файл для AVR запись Start Segment Address Record (ближе к концу файла), но эта запись обычно никак не используется (не учитывается при прошивке микроконтроллера программатором).
[Общий формат записи (General Record Format)]
RECORD MARK
‘:’RECLEN LOAD OFFSET RECTYP INFO или DATA CHKSUM 1 байт 1 байт 2 байта 1 байт n байт 1 байт Каждая запись в HEX-файле (строка) начинается с поля маркера начала записи RECORD MARK, содержащего ASCII-код 03AH, символ двоеточия ‘:’.
Следующее поле каждой записи RECLEN, которое задает количество байт полезной информации, которая содержится в записи (эти байты идут за полем RECTYP). Помните, что один байт данных представлен двумя символами ASCII. Максимальное значение для поля RECLEN является шестнадцатеричное ‘FF’, т. е. полезных данных в записи может быть от 0 до 255 байт.
Следующее поле в каждой записи LOAD OFFSET, которое указывает 16-битный начальный адрес загрузки байт данных, так что это поле используется только для записей данных (Data Record). В других типах записей, где это поле не используется, оно должно быть закодировано четырьмя ASCII-символами нуля (‘0000’ или 030303030H).
Следующее поле в каждой записи RECTYP, которое обозначает тип этой записи. Поле RECTYP используется для интерпретации информации в записи. Вот как кодируются типы записей:
‘00‘ Data Record (запись, содержащая данные)
‘01‘ End of File Record (запись, сигнализирующая о конце файла)
‘02‘ Extended Segment Address Record (запись адреса расширенного сегмента)
‘03‘ Start Segment Address Record (запись адреса начала сегмента)
‘04‘ Extended Linear Address Record (запись расширенного линейного адреса)
‘05‘ Start Linear Address Record (запись адреса начала линейного адреса)Примечание переводчика: для микроконтроллеров AVR в HEX-файле появляются только записи типа 00, 01 и 03. При этом запись типа 03 содержит абсолютный адрес старта программы в памяти, и не несет в себе никакого практического значения (эта запись обычно находится ближе к концу файла, перед записью 01 End of File Record).
Следующее поле в каждой записи переменной длины, поле INFO/DATA. Оно состоит из нулевого или большего количества байт (байт может быть от 0 до 255, в соответствии со значением поля RECLEN), где каждый байт закодирован как пара шестнадцатеричных цифр. Интерпретация этого поля зависит от значения поля RECTYP.
И наконец, каждая запись заканчивается полем CHKSUM, которое содержит шестнадцатеричное ASCII представление контрольной суммы (дополнение до двух, дополнительный код, two’s complement sum) от всех байт записи, начиная включительно от поля RECLEN, и кончая включительно последним байтом поля INFO/DATA. При этом контрольная сумма вычисляется не от самих символов ASCII, а от представления каждой пары HEX-символов ASCII как одного байта. Таким образом, сумма всех пар в записи после конвертирования каждой пары в двоичное представление, от поля RECLEN включительно до поля CHKSUM включительно, равна 0.
[Extended Linear Address Record (только для 32-битного формата)]
RECORD MARK
‘:’RECLEN
’02’LOAD OFFSET
‘0000’RECTYP
’04’ULBA CHKSUM 1 байт 1 байт 2 байта 1 байт 2 байта 1 байт Запись 32-bit Extended Linear Address Record используется для указания битов 16..31 от Linear Base Address (линейный базовый адрес, LBA), где биты 0..15 адреса LBA равны 0. Биты 16..31 LBA называются Upper Linear Base Address (верхний линейный базовый адрес, ULBA). Абсолютный адрес памяти в байте содержимого последующей Data Record получается путем добавления LBA к смещению, вычисляемому путем добавления поля LOAD OFFSET, содержащегося в Data Record, к индексу байта в Data Record (0, 1, 2, . n). Это добавление смещения делается по модулю 4G (32 бита), с игнорированием переноса, так что загрузка смещения (от 0FFFFFFFFH до 000000000H) приводит к циклическому огибанию от конца к началу 4G линейного адреса, задаваемого LBA. Линейный адрес, по которому загружается каждый отдельный байт, при этом вычисляется по формуле:
(LBA + DRLO + DRI) MOD 4G
Где DRLO равно полю LOAD OFFSET в записи Data Record, DRI равен индексу байта в записи Data Record.
Когда запись Extended Linear Address Record задает значение LBA, оно может появиться в любом месте 32-битного шестнадцатеричного объектного файла. Это значение остается эффективным, пока не появится другая запись Extended Linear Address Record. Значение по умолчанию для LBA равно нулю, пока не появится запись Extended Linear Address Record.
Примечание переводчика: в HEX-файлах AVR запись Extended Linear Address Record не используется.
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
Это поле содержит два байта 03032H, кодирующие шестнадцатеричными символами ASCII ’02’, что означает длину в байтах информации данных ULBA, содержащихся в этой записи.LOAD OFFSET
Это поле содержит байты 030303030H, кодирующие шестнадцатеричными символами ASCII ‘0000’, поскольку поле не используется в этой записи.RECTYP
Это поле содержит байты 03034H, кодирующие шестнадцатеричными символами ASCII ’04’, что задает тип записи Extended Linear Address Record.ULBA
Это поле содержит 4 шестнадцатеричные цифры ASCII, которые указывают 16-битное значение Upper Linear Base Address. Старший байт в этом адресе находится в паре 10 и 11 символов записи, младший байт в этом адресе находится в паре 12 и 13 символов записи.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET, RECTYP и ULBA.[Extended Segment Address Record (16- или 32-битный формат)]
RECORD MARK
‘:’RECLEN
’02’LOAD OFFSET
‘0000’RECTYP
’02’USBA CHKSUM 1 байт 1 байт 2 байта 1 байт 2 байта 1 байт 16-битная запись Extended Segment Address Record используется, чтобы указать биты 4..19 базового адреса сегмента Segment Base Address (SBA), где биты 0-3 адреса SBA равны 0. Биты 4..19 SBA относятся к адресу Upper Segment Base Address (USBA). Абсолютный адрес памяти, содержащий каждый конкретный байт в последующей записи Data Record получается добавлением SBA к смещению, вычисляемому путем сложения поля LOAD OFFSET в записи Data Record с индексом байта в Data Record (0, 1, 2, . n). Такое добавление смещение делается по модулю 64K (16-бит), с игнорированием переноса, так что в результате загрузка смещения огибает по циклу (от 0FFFFH до 00000H) от начала в конец сегмента 64K, заданного SBA. Адрес, по которому загружается каждый отдельный байт, при этом вычисляется по формуле:
SBA + ([DRLO + DRI] MOD 64K)
Где DRLO равно полю LOAD OFFSET в Data Record, DRI равен индексу байта в Data Record.
Когда запись Extended Segment Address Record задает значение SBA, оно может появиться в любом месте 16-битного шестнадцатеричного объектного файла. Это значение остается эффективными, пока не появится другая запись Extended Segment Address Record. Значение SBA по умолчанию равно 0, пока не появится запись Extended Segment Address Record.
Примечание переводчика: в HEX-файлах AVR запись Extended Segment Address Record не используется.
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
Это поле содержит два байта 03032H, кодирующие шестнадцатеричными символами ASCII ’02’, что означает длину в байтах информации данных USBA, содержащихся в этой записи.LOAD OFFSET
Это поле содержит байты 030303030H, кодирующие шестнадцатеричными символами ASCII ‘0000’, поскольку поле не используется в этой записи.RECTYP
Это поле содержит байты 03032H, кодирующие шестнадцатеричными символами ASCII ’02’, что задает тип записи Extended Segment Address Record.USBA
Это поле содержит 4 шестнадцатеричные цифры ASCII, которые указывают 16-битное значение Upper Segment Base Address. Старший байт в этом адресе находится в паре 10 и 11 символов записи, младший байт в этом адресе находится в паре 12 и 13 символов записи.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET, RECTYP и USBA.[Data Record (8-, 16- или 32-битный формат)]
RECORD MARK
‘:’RECLEN LOAD OFFSET RECTYP
’00’DATA CHKSUM 1 байт 1 байт 2 байта 1 байт n байт 1 байт Запись Data Record предоставляет набор шестнадцатеричных цифр, в которых находится ASCII-код байтов данных, которые содержатся в порции данных образа памяти. Метод, используемый для вычисления абсолютного адреса (линейного в случае 8 и 32 бит и сегментированного в случае 16 бит) каждого байта описан в разделах Extended Linear Address Record и Extended Segment Address Record.
Примечание переводчика: эта запись — основная для HEX-файла прошивок AVR. Обычно в одной такой записи (строке) закодировано 16 байт кода программы firmware (в поле RECLEN содержится значение ’10’). В последней строке Data Record файла HEX может содержаться меньше 16 байт (в поле RECLEN появится соответствующее значение).
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
Это поле содержит две шестнадцатеричные цифры ASCII, которые задают количество байт данных, находящихся в записи. Максимальное значение равно ‘FF’ или 04646H (что соответствует десятичному значению 255).LOAD OFFSET
Это поле содержит четыре шестнадцатеричные цифры ASCII, представляющие смещение от LBA (см. раздел Extended Linear Address Record) или SBA (см. раздел Extended Segment Address Record), что задает адрес, куда будет помещен первый байт записи.RECTYP
Это поле содержит байты 03030H, кодирующие шестнадцатеричными символами ASCII ’00’, что задает тип записи Data Record.DATA
Это поле содержит пары шестнадцатеричных цифр ASCII, где каждая пара кодирует один байт данных.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET, RECTYP и DATA.[Start Linear Address Record (только 32-битный формат)]
RECORD MARK
‘:’RECLEN
’04’LOAD OFFSET
‘0000’RECTYP
’05’EIP CHKSUM 1 байт 1 байт 2 байта 1 байт 4 байта 1 байт Запись Start Linear Address Record используется для указания стартового адреса объектного файла, с которого начнется выполнение программы. Значение дает линейный 32-битный адрес для регистра EIP. Имейте в виду, что эта запись только задает адрес кода в пределах 32-битного линейного адресного пространства процессора 80386. Если начинается выполнение кода в реальном режиме (real mode) 80386, то вместо этого должна использоваться Start Segment Address Record, поскольку эта запись указывает содержимое обоих регистров CS и IP, что необходимо для real mode.
Запись Start Linear Address Record может появиться в любом месте 32-битного шестнадцатеричного объектного файла. Если такая запись отсутствует в шестнадцатеричном объектном файле, то загрузчик свободен в назначении адреса старта по умолчанию.
Примечание переводчика: в HEX-файлах AVR запись Start Linear Address Record не используется.
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
Зто поле содержит 03034H, кодирующие шестнадцатеричными символами ASCII ’04’, что указывает длину, в байтах, содержимого регистра EIP в этой записи.LOAD OFFSET
Это поле содержит 030303030H, кодирующие шестнадцатеричными символами ASCII ‘0000’, поскольку это поле не используется в записи.RECTYP
Это поле содержит 03035H, кодирующие шестнадцатеричными символами ASCII ’05’, что задает тип записи Start Linear Address Record.EIP
Это поле содержит восемь символов ASCII шестнадцатеричных цифр, указывающих содержимое 32-битного регистра EIP. Старший байт адреса находится в паре символов 10 и 11.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET, RECTYP и EIP.[Start Segment Address Record (16- или 32-битный формат)]
RECORD MARK
‘:’RECLEN
’04’LOAD OFFSET
‘0000’RECTYP
’03’CS/IP CHKSUM 1 байт 1 байт 2 байта 1 байт 4 байта 1 байт Запись Start Segment Address Record используется для указания стартового адреса объектного файла, с которого начнется выполнение программы. Дается значение 20-битного сегментированного адреса для регистров CS и IP. Имейте в виду, что эта запись задает адрес кода только в пределах 20-битного сегментированного адресного пространства процессоров 8086/80186.
Запись Start Segment Address Record может появиться в любом месте 16-битного шестнадцатеричного объектного файла. Если такая запись отсутствует в шестнадцатеричном объектном файле, то загрузчик свободен в назначении адреса старта по умолчанию.
Примечание переводчика: в HEX-файлах AVR запись Start Segment Address Record используется, однако не несет в себе никакого практического значения. При этом значение CS равно 0, а значение IP равно байтовому адресу запуска программы firmware.
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
Зто поле содержит 03034H, кодирующие шестнадцатеричными символами ASCII ’04’, что указывает длину, в байтах, содержимого регистров CS/IP в этой записи.LOAD OFFSET
Это поле содержит 030303030H, кодирующие шестнадцатеричными символами ASCII ‘0000’, поскольку это поле не используется в записи.RECTYP
Это поле содержит 03033H, кодирующие шестнадцатеричными символами ASCII ’03’, что задает тип записи Start Segment Address Record.CS/IP
Это поле содержит восемь символов ASCII шестнадцатеричных цифр, указывающих содержимое 16-битного регистра CS и 16-битного регистра IP. Старший байт содержимого регистра CS находится в паре символов 10 и 11, младший в паре символов 12 и 13. Старший байт содержимого регистра IP находится в паре символов 14 и 15, младший в паре символов 16 и 17.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET, RECTYP и CS/IP.[End of File Record (8-, 16- или 32-битный формат)]
RECORD MARK
‘:’RECLEN
’00’LOAD OFFSET
‘0000’RECTYP
’01’CHKSUM
‘F’1 байт 1 байт 2 байта 1 байт 1 байт Запись End of File Record указывает конец шестнадцатеричного объектного файла. Это строка, в которой содержатся символы ‘:00000001FF’.
Примечание переводчика: в HEX-файлах микроконтроллера AVR эта запись также используется для обозначения конца файла.
В отдельных полях записи имеется следующее содержимое:
RECORD MARK
Это поле содержит байт 03AH, символ двоеточия, закодированный шестнадцатеричным символом ASCII (‘:’).RECLEN
то поле содержит 03030H, кодирующие шестнадцатеричными символами ASCII ’00’. Поскольку эта запись не содержит никаких данных INFO/DATA, то длина равна нулю.LOAD OFFSET
Это поле содержит 030303030H, кодирующие шестнадцатеричными символами ASCII ‘0000’, поскольку это поле не используется в записи.RECTYP
Это поле содержит 03031H, кодирующие шестнадцатеричными символами ASCII ’01’, что задает тип записи End of File Record.CHKSUM
Это поле содержит контрольную сумму полей RECLEN, LOAD OFFSET и RECTYP. Поскольку все поля статические (их содержимое неизменно), то контрольную сумму также можно вычислить статически, и её значение 04646H, кодирующие шестнадцатеричными символами ASCII ‘FF’.[Алгоритм подсчета контрольной суммы]
Байт контрольной суммы CHKSUM для строки HEX-файла вычисляется так, чтобы байтовая сумма всех полезных данных строки и самой контрольной суммы с отбрасыванием переполнений равнялась нулю. При этом складываются не сами символы ASCII, а только данные, что они представляют. Упрощенный алгоритм подсчета контрольной суммы на псевдокоде для записи Data Record:
Чтобы было совсем понятно, разберем простой пример. Вот типичная строка HEX-файла прошивки микроконтроллера AVR (для наглядности поля помечены разными цветами):
: 10 3800 00 5CC000008FC0000073C0000071C00000 E9
Эта строка требует записать в память FLASH микроконтроллера, начиная с адреса 0x3800 (адрес указан в поле LOAD OFFSET) байты 0x5C , 0xC0 , 0x00 , 0x00 , 0x8F , 0xC0 , 0x00 , 0x00 , 0x73 , 0xC0 , 0x00 , 0x00 , 0x71 , 0xC0 , 0x00 , 0x00 (байты указаны в поле DATA), всего 16 байт (так как в поле RECLEN указано значение 0x10 ). Помеченный красным байт 0x00 RECTYP обозначает тип строки (записи) Data Record. При этом контрольная сумма CHKSUM записи (сумма байт полей RECLEN, LOAD OFFSET, RECTYP, DATA) равна 0xE9 . Сумма байт всех полей RECLEN, LOAD OFFSET, RECTYP, DATA, CHKSUM должна быть равна 0.
Итак, контрольная сумма CHKSUM у нас получится, если сложим (отбрасывая перенос) байты данных начиная от поля RECLEN ( 0x10 ) до последнего байта поля DATA[RECLEN-1] ( 0x00 ), и затем вычтем из нуля полученную сумму (также отбрасывая перенос):
0xE9 = 0 — (0x10+0x38+0x00+0x00+0x5C+0xC0+0x00+0x00+0x8F+0xC0+0x00+0x00+0x73+0xC0+0x00+0x00+0x71+0xC0+0x00+0x00)
Если сложить все байты начиная от RECLEN до CHKSUM включительно (отбрасывая перенос), то получим ноль:
Файлы с расширением .HEX –чем и как их можно открыть
Формат файла hex, сокращённо от «шестнадцатеричный» или «base-16», является структурой необработанных данных, которой следуют все файлы, хранящиеся на вашем компьютере. Хотя буквально каждый документ хранится в этом формате, найти его на ПК практически невозможно. Хотя далеко не все знают, что возможность напрямую изменять необработанные биты и байты на ПК иногда может быть очень полезна.

Что обозначает расширение HEX
Система счисления, которую люди используют для подсчёта, называется десятичной (числа от 0 до 9), и была изобретена персами около 6000 лет назад. В 1950-х или 1960-х годах IBM формализовала шестнадцатеричную систему счисления, которая является коротким способом представления двоичных данных. Вместо использования цифр 0-9, шестнадцатеричное число использует цифры от 0 до F. Достигнув конца числовых «цифр», вы просто увеличиваете число влево на единицу, точно так же, как вы делаете это с системой счёта десятичных чисел.
Файлы с расширением HEX имеют те же свойства, что и двоичные. Все байты размещаются один за другим. Информация об адресе или контрольные суммы не добавляются. Единственная разница с двоичным форматом такова, что каждый байт преобразуется в 2 символа ASCII в диапазоне 0-9 и A-F, представляющие 2 шестнадцатеричные цифры. Эти символы сгруппированы по строкам. Номер пары в строке обычно может варьироваться от 1 до 255, где наиболее общей длиной являются 16 или 32 пары. Каждая строка заканчивается парой CR (ASCII-значение $ 0D) или CRLF (ASCII). Для работы с такими документами требуется специальная программа-редактор хекс-файлов. Она в удобном виде выведет всю информацию и позволит достаточно комфортно её воспринимать и изменять.

Как открыть файл HEX
Далеко не все являются программистами, и иногда открыть файл с расширением HEX может понадобиться обычному человеку, чтобы посмотреть в нём некую информацию. На самом деле для такой простой задачи вполне достаточно обычного Блокнота – стандартного приложения, которое имеется в любой системе Windows. Ведь этот файл, по сути, является текстовым, просто в нём записана специфическая информация, но обычными символами.
Для этого достаточно кликнуть на файле правой кнопкой мыши, выбрать в меню пункт «Открыть» или «Открыть с помощью», затем «Выбрать из списка установленных программ», а далее просто выбрать стандартный Блокнот. Снимите галочку с пункта «Использовать выбранную программу для всех файлов этого типа» — вдруг вы его потом будете открывать другой программой. Можно просто открыть Блокнот, а файл в него перетащить, и он откроется.
Гораздо удобнее для открытия таких файлов подходит другая версия Блокнота – Notepad++. Скачать можно по этой ссылке. Эта программа также есть у многих, так как более удобна. Но она может к тому же распознавать многие языки программирования и файлы HEX в ней выглядят гораздо удобнее, так как есть выделение цветом. Notepad++ представляет собой как бы примитивный HEX-редактор, и этим можно пользоваться совершенно свободно.

Так выглядит HEX-файл, открытый в Notepad++. В стандартном Блокноте так же, но без цвета.
А теперь рассмотрим более подробно, для чего может понадобиться открывать, а тем более изменять файлы с шестнадцатеричным содержимым. Кстати, если вы собираетесь делать это часто, то лучше скачайте и установите специальный HEX-редактор – их в Интернете довольно много. Некоторые из них подробнее рассматриваются далее.
Взлом игр и файлов
Популярная причина, по которой вы можете использовать шестнадацтеричный редактор, – взлом игр. Вы можете загрузить документ сохранения игры и изменить сумму денег, например, от 1000 до 1000000 долларов. В более поздних играх всё сделано намного сложнее. Многие современные игры используют либо сжатие, либо шифрование, что во много раз затрудняет декомпиляцию состояния сохранения или игры. Тем не менее, некоторые игры по-прежнему позволяют редактировать определённые переменные, например, Sonic Spinball. В дополнение к просмотру файлов игры, из сохранённого файла иногда можно извлечь другую важную информацию, к которой у вас иначе не было бы доступа. Это сильно зависит от типа файла и того, какую информацию вы ищете, но использование шестнадцатеричного редактора полезно для определения того, что именно находится в документе.
Отладка и редактирование
Наконец, еще одна популярная причина, по которой вы можете использовать шестнадцатеричный редактор, – это если вы программист, и вам нужно отладить код. Вместо того, чтобы возвращаться к перекомпиляции кода, для проверки шаблона может потребоваться простое шестнадцатеричное редактирование. Но для начала обязательно убедитесь, что у вас есть резервная копия, прежде чем изменять какие-либо файлы с помощью шестнадцатеричного редактора.
Какие hex-редакторы использовать
Шестнадцатеричный редактор представляет собой софт, используемый для просмотра и редактирования бинарных файлов. Двоичный документ представляет собой документ, который содержит данные в машиночитаемой форме. HEX-редакторы позволяют изменять содержимое необработанных данных файла. Поскольку шестнадцатеричный редактор используется для редактирования двоичных файлов, их иногда называют двоичным редактором или редактором двоичных файлов. Если открыть документ с помощью шестнадцатеричного редактора, появится сообщение о том, что документ редактируется в шестнадцатеричном формате, а процесс использования шестнадцатеричного редактора называется шестнадцатеричным редактированием. Шестнадцатеричные редакторы отличаются от обычных текстовых рядом функций. Основой шестнадцатеричного редактора является то, что они отображают необработанное содержимое файла. Нет кодирования или перевода в текст – только необработанный машинный код. Во-вторых, номера строк вместо того являются адресом смещения от начала файла. Мы подобрали несколько лучших бесплатных программ для просмотра и редактирования документов HEX.
HxD – это бесплатный шестнадцатеричный редактор, который может открывать и изменять компьютерный код. Это очень мощная утилита в правильных руках, которая может проверять, сравнивать и диагностировать файлы, диски, образы дисков, память и журналы, а также исправлять ошибки и восстанавливать структуру диска.

- Действительно большие данные – последняя версия HxD обрабатывает большие наборы данных. Если он помещается на диск, HxD сможет его открыть.
- Стандартные параметры – HxD содержит множество полезных дополнений, таких как генератор контрольных сумм, поддержка нескольких наборов символов, редактор ОЗУ, уничтожитель файлов, разбиение и объединение, неограниченное количество отмен и портативная версия.
- Экспорт данных – программа экспортирует данные в исходный код (C, C#, Java, Pascal и VB.NET) или в шестнадцатеричные форматы.
- Не для неопытного пользователя, но это не недостаток. Программа ориентирована на продвинутых пользователей.
DeltaHex Editor
Один из лучших hex-редакторов на основе библиотеки deltahex. Используйте действие «Открыть как шестнадцатеричный» в главном меню «Файл» или в контекстном меню файлов проекта.
- Отображение данных в виде шестнадцатеричного кода, предварительный просмотр текста.
- «Вставить» и «Перезаписать» режимы редактирования.
- Поддержка выбора и буфера обмена.
- Отмена/повтор.
- Выбор кодировки.
- Отображение непечатных символов.
- Коды также могут быть двоичными, восьмеричными или десятичными.
- Поиск текстового/шестнадцатеричного кода с соответствующей подсветкой.
- Дельта-режим – изменения сохраняются только в памяти до сохранения.
- Поддержка огромных файлов.

Free Hex Editor Neo
Free Hex Editor Neo – это самый быстрый бесплатный редактор двоичных файлов для платформы Windows. Алгоритмы обработки данных Neo Hex Editor чрезвычайно оптимизированы и тщательно настроены для обработки операций с большими файлами.
- Неограниченное Undo/Redo.
- Редактировать, Копировать, Вырезать, Вставить, Удалить, Заполнить, Импорт/Экспорт, Вставить шаблон/файл, Изменить размер файла, Смещение к началу, Изменить биты.
- Поиск и замена шаблонов.
- Подсветка.
- Байты, слова, двойные слова, группировка четырёх слов.
- Шестнадцатеричное, Десятичное, Восьмеричное, Двоичное и т.д. представление данных.
- Изменение атрибутов файла.
- Анализ данных буфера обмена.
- Создание бинарных патчей, поиск/замена регулярных выражений.
- Многоязычный интерфейс.

Функции и возможности утилиты:
- Статистика и шестнадцатеричный анализатор – модуль анализа двоичных данных позволяет анализировать распределение байтов, символов и строк по шестнадцатеричным дампам и текстовым данным. Анализатор двоичных файлов Neo поддерживает шаблоны следующих типов: шаблоны символов и строк ASCII/Unicode, шаблоны данных Hex, Decimal, Octal, Binary, Float, Double и RegEx (Regular Expression).
- Графическое представление проанализированных данных в пользовательском интерфейсе Neo – софт поддерживает тепловую карту и визуализацию данных гистограммы. Вы также можете анализировать двоичный документ в форме описательной статистики: среднее значение, дисперсия выборки, стандартное отклонение, стандартная ошибка, эксцесс, асимметрия, медиана, диапазон, минимальное, максимальное, сумма и т.д.
- Сравнение файлов – Neo представляет собой расширенный инструмент сравнения в шестнадцатеричном формате. Встроенный редактор hex позволяет сравнивать 2 шестнадцатеричных файла, используя два разных алгоритма сравнения: простой (от байта к байту) и алгоритм разности (сопоставление блоков).
- Редактор ОЗУ – модификатор процесса позволяют редактировать память и обрабатывать данные, загруженные в ОЗУ ПК операционной системой. RAM Explorer предоставляет возможность легко просматривать загруженные процессы и переходить к определённым смещениям. Затем вы можете напрямую обращаться к этим блокам данных и редактировать их в окне шестнадцатеричного редактора. Таким образом, Hex Editor Neo предоставляет возможность просматривать и редактировать данные бинарных программ прямо в оперативной памяти.
- Дизассемблер – программа также позволяет разбирать исполняемые файлы x86, x64 и .NET. Neo Assembler View поддерживает следующие наборы инструкций: x86, x86-64, MMX, SSE, SSE2, 3DNow!, MSIL. Вы можете загружать файлы символов как для 32-битных, так и для 64-битных исполняемых файлов. Neo – просто идеальный редактор dll/exe!
- Двоичные шаблоны/редактор структуры – программа поддерживает синтаксический анализ внутренней структуры следующих файлов: exe, dll, sys, ocx, bmp, png, avi, rar, icc, vhd, zip, tiff, wav, tga, psd, pic, pcx, pal, emf EPS.
- Модуль Structure View – позволяет настраивать двоичные шаблоны. Вы можете написать своё собственное определение структуры файла, используя внутренний язык, подобный C/C++, почти для любого двоичного документа. Например, если вы хотите редактировать файлы данных, вам нужно сначала описать файловую структуру, а затем привязать её к конкретному файлу, используя специальное окно редактора.
- Анализатор структуры файла делает двоичную корректировку намного проще, чем просто редактирование необработанных шестнадцатеричных байтов. Открывайте, просматривайте и редактируйте файлы hex/bin с небывалой лёгкостью!
Hex Editor Neo предоставляет базовые, расширенные и даже инновационные функции. Шестнадцатеричное редактирование теперь доступно каждому начинающему пользователю!
PSPad
Любимый шестнадцатеричный редактор большинства программистов. PSPad, помимо того, что он является отличным редактором текста и кода, предлагает опцию «Открыть в HEX Editor…», которая запускает специальный режим редактирования. Когда вы находитесь в этом режиме, вы можете увидеть местоположение и шестнадцатеричные значения каждого бита файла. У вас есть два варианта корректировки – вы можете редактировать шестнадцатеричные значения по местоположению, или справа у вас есть буквенно-цифровое представление этого значения, которое вы также можете редактировать.

XVI32
XVI32 также очень способный шестнадцатеричный редактор. Как и в PSPad, вы можете редактировать шестнадцатеричные значения напрямую или через отображение символов. В нём также есть несколько расширенных инструментов редактирования шестнадцатеричных кодов, таких как калькулятор адресов для проверки смещений и других специфичных для шестнадцатеричных данных параметров, которые могут помочь вам обойти шестнадцатеричный документ. Если вы, конечно, знаете, что делаете.
Знание того, как работает ваш ПК, становится всё более и более важным, поскольку техника становится всё проще и проще в использовании. Если у вас остались вопросы относительно редактирования шестнадцатеричных файлов, оставьте комментарий под этой статьёй.
