IntelHEX格式简介
如何读懂hex文件

如何读懂hex⽂件什么是Intel HEX ⽂件格式Intel HEX ⽂件是遵循Intel HEX ⽂件格式的ASCII ⽂本⽂件。
在Intel HEX ⽂件的每⼀⾏都包含了⼀个HEX 记录。
这些记录是由⼀些代表机器语⾔代码和常量的16进制数据组成的。
Intel HEX ⽂件常⽤来传输要存储在ROM 或者EPROM 中的程序和数据。
⼤部分的E PROM 编程器能使⽤Intel HEX ⽂件。
Intel HEX由任意数量的⼗六进制记录组成。
每个记录包含5个域,它们按以下格式排列:Start Code每个Intel HEX 记录都由冒号开头Byte count是数据长度域,它代表记录当中数据字节的数量Address是地址域,它代表记录当中数据的起始地址Record type是代表HEX记录类型的域,它可能是以下数据当中的⼀个:00-数据记录01-⽂件结束记录02-扩展段地址记录03-开始段地址记录04-扩展线性地址记录05-开始线性地址记录Data是数据域,⼀个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域中指定的数字相符Checksum是校验和域,它表⽰这个记录的校验和.校验和的计算是通过将记录当中所有⼗六进制编码数字对的值相加,以256为模进⾏以下补⾜。
HEX⽂件以⾏为单位。
每⾏以字符‘:’ (0x3a)开头,以回车换⾏符0x0d, 0x0a为结束。
每⾏开始和结束之间的所有内容,都是以字符形式表现的。
例如数据如果是 0x1A ,那么转换到HEX格式的⾏⾥⾯就是0x31 0x41。
如果数据是16bit的,例如地址,则先显⽰⾼位,后显⽰底位。
例如 0x1234,转换成HEX格式⽂件后变成 0x31 0x32 0x33 0x34,显⽰出来以后就是1234。
将数据部分内容每2个字符看做⼀个HEX数据,例如::020*********FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA第⼀个 0x02 为数据长度。
HEX格式介绍及分析程序

Intel HEX格式你熟悉吗?——HEX格式介绍及分析程序来源:21ic 作者:LPC900栏目:MCU技术INTEL HEX格式你熟悉吗?——HEX格式介绍及分析程序用Keil C51编程时,可以自动生成INTEL HEX格式的程序文件。
INTEL HEX文件通常由若干个记录组成,每个记录都具有如下的形式::ll AAAA ttdd...ddcc其中:开头的冒号“:”是记录起始标志。
“ll”是记录的有效数据长度。
“AAAA”是装入地址。
“tt”是记录类型。
00表示数据记录,01表示结束。
“dd...dd”是记录中的有效数据。
数据个数必须与“ll”一致。
“cc”校验和。
将它的值与记录中所有字节(冒号“:”除外)内容相加,其结果应为00,否则出错。
举例:某行记录的内容是“:05012000B5412B215543”,则数据长度ll是05H,装入地址是0120H,记录类型是数据记录,有效数据是B5H、41H、2BH、21H、55H,校验和为43H。
在文件的最后一行,总是“:00000001FF”,表示无任何有效数据,装入地址为0000H(没有用处),记录类型为01H,表示结束,校验和当然是FFH了。
以下是一个分析INTEL HEX记录的简单程序:/*INTEL HEX.h分析处理INTEL HEX格式记录的头文件*/#ifndef _INTEL_HEX_H_#define _INTEL_HEX_H_#include <ctype.h>#include <string.h>//定义INTEL HEX记录的结构struct{unsigned CHAR ll; //长度unsigned int AAAA; //地址unsigned CHAR tt; //记录类型,0-数据,1-终止CHAR dd[16]; //数据CHAR cc; //校验和}INTEL HEX;/*函数:AnalyseHEX()功能:分析一条HEX记录(把INTEL HEX记录的文本转换成INTEL HEX结构)参数:hex[]是记录的文本一行内容转换后的结果保存在INTEL HEX结构中返回:0-转换成功1-HEX记录文本中有错误*/bit AnalyseHEX(CHAR hex[]){unsigned CHAR i;unsigned CHAR j;unsigned CHAR t;unsigned CHAR n;unsigned CHAR cc;unsigned int x;//检查冒号if ( hex[0] != ':' ) return 1;//检查长度t = (toint(hex[1])<<4) + toint(hex[2]);if ( t > 16 ) return 1;n = 2 * t + 11;if ( n != strlen(hex) ) return 1;INTEL HEX.ll = t;cc = t;//提取地址t = (toint(hex[3])<<4) + toint(hex[4]);cc += t;x = (unsigned int)t;x <<= 8;t = (toint(hex[5])<<4) + toint(hex[6]);cc += t;x += (unsigned int)t;INTEL HEX.AAAA = x;//提取记录类型t = (toint(hex[7])<<4) + toint(hex[8]);if ( (t==0) || (t==1) ){cc += t;INTEL HEX.tt = t;}else{return 1;}//提取数据i = 9;if ( t == 0 ){j = 0;n = INTEL HEX.ll;do{t = (toint(hex[i++])<<4);t += toint(hex[i++]);cc += t;INTEL HEX.dd[j++] = t;} while ( --n != 0 );}//提取校验和t = (toint(hex[i++])<<4);t += toint(hex[i++]);cc += t;INTEL HEX.dd[j++] = t;//检查校验if ( cc == 0 )return 0;elsereturn 1;}#endif。
hex 格式解析

hex 格式解析HEX格式是一种常用的二进制文件格式,主要用于存储程序和数据。
它是一种文本文件,由一行行符合HEX文件格式的文本组成。
在这些文本中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码字节组成。
HEX文件通常用于传输将被存储在ROM或EPROM中的程序和数据。
大多数EPROM编程器或仿真器使用HEX文件。
HEX文件格式主要有两种:Intel HEX和Motorola SREC(也称为Mot)。
Intel HEX文件由一行行符合Intel HEX文件格式的文本组成。
在Intel HEX文件中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码字节组成。
Motorola SREC文件则是另一种HEX格式,它按照不同的编码方式组织数据。
要解析HEX文件,可以将其拆分成以下几个部分:1. 文件头:文件头包含文件类型、版本和起始地址等信息。
文件头通常位于文件的开头,用于指示文件的类型和结构。
2. 数据记录:数据记录是HEX文件中的基本单元,包含机器语言码和/或常量数据的十六进制编码字节。
每一行都是一个数据记录,它们按照顺序排列在文件中。
3. 数据记录之间的分隔符:HEX文件中的数据记录之间使用分隔符进行分隔。
常见的分隔符有:空格、制表符(TAB)、换行符(CR)等。
4. 文件尾:文件尾是HEX文件的最后一个部分,它表示文件的结束。
文件尾通常包含一个表示文件结束的特定字符或字节序列。
在解析HEX文件时,需要关注以下几个方面:1. 确定文件类型和格式:根据文件头信息,判断文件的类型和格式。
2. 提取数据记录:从文件中提取数据记录,解析记录中的机器语言码和常量数据。
3. 处理记录之间的分隔符:去除记录之间的分隔符,以便将数据记录合并为一个连续的数据流。
4. 检查文件尾:确认文件是否完整,以及文件尾是否正确。
5. 分析数据:根据解析出的数据记录,分析文件中的程序和数据。
HEX文件格式

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。
Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Int el HEX文件。
很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。
但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d, 0x0a)。
行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0 x01;”0a”,就表示0x0a。
对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。
下面为HEX文件中的一行::10000000FF0462FF051EFF0A93FF0572FF0A93FFBC“:”表示一行的开始。
“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。
第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
第7,8个字符“00”表示数据的类型。
该类型总共有以下几种:00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为::00000001FF以上的信息其实就足够进行HEX转BIN格式的程序的编写。
首先我们只处理数据类型为0x00及0x01的情况。
0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。
一种英特尔Hex文件的解析和填充方法

4 Hex 文件解析的实现
图 1 中展示的 Hex 文件内容,PROM 从地址 0x8001000 至 0x803FFFFF,共计 4032Kbytes。 文件以 Record Type 0x04 为起始,以 Record Type 0x01 为结束,中间行穿插着 Record Type 0x04,分别记录了不同的 linear Address,如果上一个 Record 的结束地址与当前 Record 的起始地址不连续,则视 为 Block 中断。
容位于 MCU PROM 中的哪个位置; ● Record 的类型,表示第 5 个域中所含内容的意义,所
含的是一个基地址或数据; ● Record 的校验和,表示这个 Record 中所含数据的校
验和。
● RecordType 0x00,表示域 5 中的内容是数据。 ● RecordType 0x01,表示这是整个 hex 文件中最后一个 record。 ● RecordType 0x02,可同时用于 16 位和 32 位格式的 MCU,表示 16 位地址中的高 12 位,低 4 位是 0。 ● RecordType 0x03,可同时用于 16 位和 32 位格式的 MCU,是专门针对 8086 和 80186 这种架构的 MCU,DATA 中定义的 4 字节数据是 CS 和 IP 寄存器中的值。 ● RecordType 0x04,仅针对 32 位格式的 MCU,表示的 是 32 位地址的高 16 位基地址,低 16 位是 0x0000。 ● RecordType 0x05,这种 record type 仅针对 32 位格式 的 MCU,表示的是这个 hex 文件内容的起始执行地址。 根据 Record Type 对 Hex 文件中的每个 Record 进行相应 意义的解析,从而梳理出 Hex 文件的起始执行地址,每个 Block 的起始地址和长度。
hex、bin、elf、axf文件区别

hex,bin,axf,elf的区别一、HEX 和 BINHex文件,这里指的是Intel标准的十六进制文件,也就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示.具体格式介绍如下: Intel hex 文件格式Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
Intel hex 文件全部由可打印的ASCII字符组成,如下例所示::2000000012014c75a800e4f508f509780a7a78e4f608dafcd283fcfded240af9a 7050dbd81:2000200000010ced2488ec34ff50edc283e4fcfded240af9e76d7013ed33e43c7 00d0dbd2a:2000400000010ced2488ec34ff50e50509e50970020508e50924a8e50834fd50a ee4f50874Intel hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下::CCAAAARR...ZZ其中:CC本条记录中的数据字节数AAAA本条记录中的数据在存储区中的起始地址RR记录类型:00 数据记录 (data record)01 结束记录 (end record)02 段记录 (paragraph record)03 转移地址记录 (transfer address record)...数据域ZZ数据域校验和Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。
校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。
Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"顺序格式"按assembly code顺序翻译成binary machine code.Bin是直接的内存映象的表示。
Intel的hex格式含义

Intel的hex格式含义Intel HEX file(文件名.hex)是具有约定格式的ASCII文本文件。
文件中每一行包含一个HEX 记录(record)。
记录由十六进制数组成,这些数字代表机器指令码或常量。
Intel HEX files 用来向ROM中传递代码和数据,即它和Bin文件类似,指导下载程序或仿真器将指令码和数据下载到ROM存储器特定的位置上。
Intel HEX file可以包含任意多行记录(record),每个record主要由5个部分(域)组成,每部分至少包含两个十六进制字符,即一个字节(8位),其具体形式为“:llaaaatt[dd...]cc ”其中:“:”表示record的开始“ll”表示record中数据位(dd)的长度(几个字节)“aaaa”表示record中的数据存储起始地址“tt”表示record类型,可以为00(数据record),01(文件结束record),02(扩展段地址record),04(扩展线性地址record)“dd”表示record数据的一位,一个record可能包含多个数据字节,数据字节的数量必须与ll中指定的相一致“cc”表示record的校验域,下面给出一个实例:10008000AF5F67F0602703E0322CFA92007780C361:1000900089001C6B7EA7CA9200FE10D2AA00477D81:0B00A00080FA92006F3600C3A00076CB:00000001FF第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录 1 记录文件结束 2 扩展段地址记录 3 开始段地址记录 4 扩展线性地址记录 5开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围, 所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.一个段地址定义的格式如下:起始符长度起始地址扩展段标示扩展段序号无用累加和: 02 0000 02 3000 EC段地址的标识符是第四组数据02,表示扩展地址段的定义,再后面的以为HEX数表示段的数目, 上面的定义为3,表示段地址是3,所以下面的数据地址是3 + XX(XX是64K段内的地址)目标文件.HEX的各部分具体含义.HEX是Intel的目标文件格式。
Intel HEX文件

+---------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | '00' | | | +---------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +---------------------------------------------------------------+
2 -
BIN文件格式 对二进制文件而言,其实没有”格式”。 文件只是包括了纯粹的二进制数据。
3 -
HEX文件格式 HEX文件都是由记录(RECORD)组成的。 在HEX文件里面,每一行代表一个记录。
记录的基本格式为:
+---------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | | | | +---------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +---------------------------------------------------------------+
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是Intel HEX格式?
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录
由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输
存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件.
记录格式
一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.
:llaaaatt[dd...]cc
每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.
:冒号是每一条Intel HEX记录的开始
ll 是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa 是地址域,他表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>
tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明
cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对
<不包括本效验字和冒号> 所表示的十六进制数字
<一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>
都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.
<例如:
:0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x 9C=0x9D
C语言描述:
UCHAR cc;
cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
cc++;
>
数据记录
Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束
<回车为0x0d换行为0x0a>
比如下面的一条数据记录
:10246200464C5549442050524F46494C4500464C33
10 是此行记录数据的字节数目
2462 是数据在内存<将要烧写的eprom地址>中的起始地址
00 是记录类型00(是一个数据记录)
464C 到464C 是数据
33 是此行记录的效验和
扩展线性地址记录(HEX386)
扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:
:02000004FFFFFC
02 是记录的数据字节数目
0000 是地址域这在扩展地址记录中总是0000
04 是记录类型04(扩展地址记录)
FFFF 是高16位地址
FC 是记录效验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)
当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存
并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录.
绝对内存地址= 数据记录中的地址+ 移位后的扩展线性地址
下面举例说明这个过程
从数据记录的地址域得到地址2462
从扩展线性地址记录的地址域得到地址FFFF
绝对内存地址FFFF2462
扩展段地址记录(HEX86)
扩展段地址记录也被称为HEX86记录, 包含4-19位的数据地址段,
这个扩展段地址记录总是有两字节数据,如下:
:020*********EA
02 是记录中的数据字节数目
0000 是地址域,在扩展段地址记录中,这个域总是0000
02 是记录类型02(扩展段地址的标示)
1200 是该段的地址
EA 是效验和
计算如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录
绝对内存地址= 数据记录中的地址+ 移位后的扩展段地址
数据记录中的地址域移位后扩展段地址记录中的地址域
下面举例说明这个过程
从数据记录的地址域得到地址 2 4 6 2
从扩展段地址记录的地址域得到地址 1 2 0 0
绝对内存地址0 0 0 1 4 4 6 2
文件结束记录(EOF)
一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01, 一个EOF记录总是这样:
:00000001FF
00是记录中数据字节的数目
0000这个地址对于EOF记录来说无任何意义
01记录类型是01(文件结束记录标示)
FF是效验和计算如下
01h + NOT(00h + 00h + 00h + 01h).
========================
总结
形如
:BBAAAATTHHHH...HHHHCC
BB: Byte
AAAA:数据记录的开始地址,高位在前,地位在后
因为这个格式只支持8bits,地址被倍乘
所以,为了得到实际的PIC的地址,需要将地址除以2
TT: Type
00 数据记录
01 记录结束
04 扩展地址记录(表示32位地址的前缀,当然这种只能在INHX32) HHHH:一个字(Word)的数据记录,高Byte在前,低Byte在后
TT之后,总共有BB/2 个字的数据
CC: 一个Byte的CheckSum
因为PIC16F873A只有4K的程序空间
所以,不会有TT=04的Linear Address Record。