本文目录一览:
- 1、hex文件夹可以删除吗
- 2、HEX是什么
- 3、HEX 文件格式
- 4、hex是什么文件格式
- 5、hex什么意思
- 6、如何解析HEX
hex文件夹可以删除吗
hex一般是单片机的可执行文件,有源文件可以生成,如果被下载进了芯片可以删了。
HEX是什么
Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
记录格式
Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
: 每个Intel HEX记录都由冒号开头.
ll 是数据长度域,它代表记录当中数据字节(dd)的数量.
aaaa 是地址域,它代表记录当中数据的起始地址.
tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 – 数据记录
01 – 文件结束记录
02 – 扩展段地址记录
04 – 扩展线性地址记录
dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.
cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.
数据记录
Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中数据字节的数量.
2462 是数据将被下载到存储器当中的地址.
00 是记录类型(数据记录)
464C…464C是数据.
33 是这个记录的校验和.
扩展线性地址记录(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下:
: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位数据地址段.扩展段地址记录总是有两个数据字节,外观如下:
:020000021200EA
其中:
02 是记录当中数据字节的数量.
0000 是地址域.对于扩展段地址记录,这个域总是0000.
02 是记录类型 02(扩展段地址记录)
1200 是地址段.
EA 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址 2462
扩展段地址记录数据域 + 1200
---------
绝对存储器地址 00014462
文件结束(EOF)记录
Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下:
:00000001FF
其中:
00 是记录当中数据字节的数量.
0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址.
01 是记录类型 01(文件结束记录)
FF 是这个记录的校验和,计算方法如下:
01h + NOT(00h + 00h + 00h + 01h).
Intel HEX文件例子:
下面是一个完整的Intel HEX文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF
HEX 文件格式
HEX 文件是可以烧录到 MCU 中,被 MCU 执行的一种文件格式。如果用记事本打开可发现,整个文件以行为单位,每行以冒号开头,内容全部为 16 进制码(以 ASCII 码形式显示)。
HEX 文件都是由记录(RECORD)组成的。在 HEX 文件里面,每一行代表一个记录。记录的基本格式为:
RECORD MARK":"(1) + LENGTH(1) + LOAD OFFSET(2) + RECTYPE(1) + INFO or DATA(n) + CHKSUM(1)
例如 “:1000080080318B1E0828092820280B1D0C280D2854” 可以被看作 “0x10 0x00 0x08 0x00 0x80 0x31 0x8B 0x1E 0x08 0x28 0x09 0x28 0x20 0x28 0x0B 0x1D 0x0C 0x28 0x0D 0x28 0x54”
第一个字节 0x10 表示本行数据的长度;
第二、三字节 0x00 0x08 表示本行数据的起始地址;
第四字节 0x00 表示数据类型,数据类型有:
0x00: Data Rrecord,用来记录数据,HEX 文件的大部分记录都是数据记录
0x01: End of File Record,用来标识文件结束,放在文件的最后,标识 HEX 文件的结尾
0x02: Extended Segment Address Record,用来标识扩展段地址的记录
0x03: Start Segment Address Record,开始段地址记录
0x04: Extended Linear Address Record,用来标识扩展线性地址的记录
0x05: Start Linear Address Record,开始线性地址记录
第五字节开始是数据;
最后一个字节 0x54 为校验和,计算本行前面所有 16 进制码的累加和(不计进位),校验和 = 0x100 - 累加和。
在上面的后两种记录,都是用来提供地址信息的。每次碰到这两个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。
再看个例子:
:020000040008F2
:10000400FF00A0E314209FE5001092E5011092E5A3
:00000001FF
对上面的 HEX 文件进行分析:
第 1 条记录的长度为 0x02,LOAD OFFSET为 0x0000,RECTYPE 为 0x04,说明该记录为扩展段地址记录。数据为 0x00 0x08,校验和为 0xF2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为 (0x0008 16),后面的数据记录都以这个地址为基地址。
第 2 条记录的长度为 0x10(16),LOAD OFFSET为 0x0004,RECTYPE为 0x00,说明该记录为数据记录。数据为 0xFF 0x00 0xA0 0xE3 0x14 0x20 0x9F 0xE5 0x00 0x10 0x92 0xE5 0x01 0x10 0x92 0xE5,共 16 字节。这个记录的校验和为0xA3。此时的基地址为 0x80000,加上 OFFSET,这个记录里的 16 字节数据的起始地址就是 0x80000 + 0x0004 = 0x80004.
第 3 条记录的长度为 0x00,LOAD OFFSET 为 0x0000,RECTYPE 位 0x01,校验和为 0xFF。说明这个是一个 END OF FILE RECORD,标识文件的结尾。
在上面这个例子里,实际的数据只有 16 字节:FF00A0E314209FE5001092E5011092E5,其起始地址为 0x0004
hex是什么文件格式
hex文件格式是可以烧写到单片机中,被单片机执行的一种文件格式。
生成Hex文件的方式有很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。
Intel HEX文件由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和常量数据的十六进制编码数字组成。
扩展资料:
一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01,Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。
Intel hex 文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。校验和是取记录中从数据字节计数域CC到数据域最后一个字节的所有字节总和的 2 的补码。
参考资料来源:百度百科——hex文件格式
hex什么意思
Hex(全称:Intel HEX)文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件,由任意数量的十六进制记录组成。 扩展资料
在Intel HEX文件中,每一行包含一个HEX记录。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
如何解析HEX
hex文件是用ASCII来表示二进制的数值,十六进制数组成的指令或者数据,每一行就是一个hex记录。由于单片机执行的只能是二进制指令和数据,而hex文件是十六进制数,所以烧录器的工作必然有一个进制转换机制。
hex文件的内容都是有规律的编码,我们可以对它进行解析,以第一行 :020000040800F2 为例:
1) 每一行都以 :(0x3A)开头
2) 第1个字节0x02 ,表示数据区的字节个数
3) 第2、3字节0x00, 0x00 ,表示偏移地址或无用填0
4) 第4个字节0x04, 表示本行记录的数据类型
‘00’ Data Record :用来记录数据, HEX文件的大部分记录都是数据记录
‘01’ End of File Record :用来标识文件结束,放在文件的最后,标识HEX文件的结尾
‘02’ Extended Segment Address Record :用来标识扩展段地址的记录
‘03’ Start Segment Address Record :段地址 STM32不用
‘04’ Extended Linear Address Record :用来标识扩展线性地址
‘05’ Start Linear Address Record :程序启动运行的地址
5) 第5、6个字节0x08, 0x00即是数据
6) 第7个字节0xF2是校验字节,校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
7) 每条数据最后还有0x0d (回车键)、 0x0a(换行键)
0x3a [数据长度-1Byte] [数据地址-2Byte] [数据类型-1Byte] [数据-nByte] [验证码-1Byte] 0x0d0x0a
注意:由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,
第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为(0x0004 16) | 0x0000,也就是写入FLASH的0x40000这个地址。
第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过7k的时候,文件中就会出现多个Extended Linear Address Record。
----------------------------------------------------
:020000040008F2
:10000400FF00A0E314209FE5001092E5011092E5A3
:00000001FF
-----------------------------------------------------
对上面的HEX文件进行分析:
第1条记录的长度为02,LOAD
OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0008
16)。后面的数据记录都以这个地址为基地址。
第2条记录的长度为10(16),LOAD
OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X80000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000
+ 0x0004 = 0x80004.
第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。
在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x0004.
计算从(0x3a)以后的所有各字节的和模256的余。
即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出的值就是此行校验码。举一个简单的例子,
如第一行020000040800F2
0x02+0x00+0x00+0x00+0x04+0x08+0x00 = 0x0E
0x100 – 0x0E = 0xF2
for (i = 0; i pHexFileFormat-DataSize; i++)
{
tempCheckSum += pHexFileFormat-bData[i];
}
tempCheckSum = 0x100 - tempCheckSum;
if (tempCheckSum != pHexFileFormat-CheckSum)
{
//Error
}
#ifndef CHEX_H
#define CHEX_H
#include QFile
const quint8 MIN_HEX_LINE_COUNT_LENGHT = 12;
typedef enum __tagHexErrorCode
{
HEX_NO_ERROR = 0,
HEX_FORMAT_ERROR,
HEX_VERIFY_ERROR,
HEX_LENGHT_ERROR,
HEX_USERPAPR_EEROR,
}EHexErrorCode;
typedef enum __tagHexType
{
RECORD_DATA = 0,
RECORD_END_OF_FILE,
RECORD_EXTENDED_SEGMENT_ADDRESS,
RECORD_START_SEGMENT_ADDRESS,
RECORD_EXTENDED_LINEAR_ADDRESS,
RECORD_START_LINEAR_ADDRESS,
RECORD_HEX_MAX,
}emHexType;
typedef struct __tagHexLineData
{
emHexType type;
quint8 count;
quint32 address;
quint8 data[80];
quint8 checksum;
quint8 datalen;
}stHexLineData;
class CHex
{
public:
CHex();
EHexErrorCode getHexLineData(QByteArray bydata,stHexLineData *p);
private:
char ConvertHexChar(char ch);
};
#endif // CHEX_H
#include "chex.h"
const QString HexTypeTable[6] =
{
"00","01","02","03","04","05",
};
CHex::CHex()
{
}
char CHex::ConvertHexChar(char ch)
{
if((ch = '0') (ch = '9'))
return (ch-0x30);
else if((ch = 'A') (ch = 'F'))
return ((ch-'A')+10);
else if((ch = 'a') (ch = 'f'))
return ((ch-'a')+10);
else return (-1);
}
EHexErrorCode CHex::getHexLineData(QByteArray bydata,stHexLineData *p)
{
quint8 i = 0;
quint8 cs_temp = 0;
QString str(bydata);
char *pcdata = bydata.data();
quint32 linelen = str.size();
if((linelen MIN_HEX_LINE_COUNT_LENGHT)) {return HEX_LENGHT_ERROR;}
if(*pcdata != 0x3A) {return HEX_FORMAT_ERROR;}//必须以":"号开始
//获取Type
QString stype = str.mid(7,2);
for(i = 0; i RECORD_HEX_MAX; i++)
{
if(stype == HexTypeTable[i])
{
p-type = (emHexType)i;
break;
}
}
if(i == RECORD_HEX_MAX) {qDebug("HEX_FORMAT_ERROR");return HEX_FORMAT_ERROR;}
cs_temp += (ConvertHexChar(*(pcdata + 7)) 4) | ConvertHexChar(*(pcdata + 8));
//获取count
p-count = (ConvertHexChar(*(pcdata + 1)) 4) | ConvertHexChar(*(pcdata + 2));
cs_temp += p-count;
if(p-count != (((linelen - 2) / 2) - 5)) {qDebug("HEX_FORMAT_ERROR");return HEX_FORMAT_ERROR;}
//获取address
p-address = (ConvertHexChar(*(pcdata + 3)) 12) | (ConvertHexChar(*(pcdata + 4)) 8) | (ConvertHexChar(*(pcdata + 5)) 4) | ConvertHexChar(*(pcdata + 6));
cs_temp += (p-address 8) 0xFF;
cs_temp += p-address 0xFF;
//获取data
for(i = 0; i p-count; i++)
{
p-data[i] = (ConvertHexChar(*(pcdata + 2*i + 9)) 4) | ConvertHexChar(*(pcdata + 2*i + 10));
cs_temp += p-data[i];
}
p-checksum = (ConvertHexChar(*(pcdata + 2*i + 9)) 4) | ConvertHexChar(*(pcdata + 2*i + 10));
if(p-checksum != ((0x100 - cs_temp) 0xFF))
{
qDebug("HEX_VERIFY_ERROR");
return HEX_VERIFY_ERROR;
}
p-datalen = p-count;
return HEX_NO_ERROR;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。