手机版

百科生活 投稿

hex文件格式,HEX文件格式(HEX文件格式解析)

百科 2026-01-15 19:45:49 投稿 阅读:8763次

关于【hex文件格式】:HEX文件格式,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

  • 内容导航:
  • 1、HEX文件格式
  • 2、HEX文件格式解析

1、HEX文件格式

  HEX的全称是Intel HEX,此类文件通常用于传输将被存于ROM或者EPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。大多数EPROM编程器或模拟器使用Intel HEX文件。HEX文件记录由对应机器语言码或常量数据的十六进制编码数字组成。

2、HEX文件格式解析

1 什么是HEX文件

HEX文件是由一行行符合 HEX文件格式的文本所构成的ASCII文本文件。在HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。

hex文件格式,HEX文件格式(HEX文件格式解析)

2 HEX文件格式

一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下:

hex文件格式,HEX文件格式(HEX文件格式解析)

HEX文件由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:

每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

(冒号)每个HEX记录都由冒号开头 ;

LL 是数据长度域, 它代表记录当中数据字节(dd)的数量;

aaaa 是地址域, 它代表记录当中数据的起始地址;

TT是代表HEX记录类型的域,它可能是以下数据当中的一个:

00 – 数据记录(Data Record)

01 – 文件结束记录(End of FileRecord)

02 – 扩展段地址记录(ExtendedSegment Address Record)

03 – 开始段地址记录(Start Segment Address Record)

04 – 扩展线性地址记录(Extended Linear Address Record)

05 – 开始线性地址记录(Extended Segment Address Record)

D..D是数据域 , 它代表一个字节的数据. 一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.

CC 是校验和域 , 它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加, 以256为模进行以下补足.

表示为:“:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”

3、具体事例解析

具体根据记录类型分析如下:

(1)数据记录”00”:10246200464C5549442050524F46494C4500464C33

其中:10是这个记录当中数据字节的数量.即0x10 ;

2462 是数据将被下载到存储器当中的地址.即0x2462 ;

00 是记录类型( 数 据 记录).即0x00 ;

464C…464C是 数据.分别代表0x46,0x4C... ;

33是这个记录的校 验和即0x33;计算方法如下:256D-(10H+24H+62H+00H+46H+4CH+55H+49H+44H+20H+50H+52H+4FH+46H+49H+4CH+45H+00H+46H+4CH)/100H=33H;

(2)文件结束(EOF)”01”:00000001FF

其中:00是记录当中数据字节的数量.

0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义,被忽略的.0000h 是典型的地址;

01 是记录类型 01( 文件 结 束 记录)

FF 是 这个记录 的校 验 和, 计算方法如下: 256D-(00H+00H+00H+01H)=FFH;

(3)扩展线性地址记录(HEX386) ”04”:02000004FFFFFC

其中:02 是这个记录当中 数 据字 节 的 数量.

0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.

04 是记录类型 04( 扩 展 线 性地址 记录)

FFFF 是地址的高16 位.

FC 是这个记录的校 验 和, 计算如下: 256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;

当一个扩展线性地址记录被读取, 存储于数据域的扩展线性地址被保存,它被应于

从 HEX 文件读取来的随后的记录 . 线性地址保持有效, 到它被另外一个扩址录所改变。

通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得 数据记录的绝对存储器地址。

以下的例子演示了这个过 程:

:0200000480007A //数据记录的绝对存储器地址高16位为0x8000

:100000001D000A00000000000000000000000000C9

:100010000000000085F170706F0104005D00BD00FC

第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x8000,第二行是DataRecord,里面的地址值是0x0000。那么数据1D000A00000000000000000000000000(共16个字节)要写入FLASH中的地址为 (0x8000<< 16)| 0x0000,也就是写入FLASH的0x80000000这个地址;第三行的数据写入地址为0x80000010.当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。

(4)扩展段地址记录(HEX86)“02“:020000021200EA

其中:02 是记录当中数据字节的数量;

0000 是地址域. 对于扩展段地址记录 ,这个域总是0000;

02 是记录类型 02( 扩展段地址记录);

1200 是地址段;

EA 是这个记录的校 验 和;

当一个扩展段地址记录被读取, 存储于数据域的扩展段地址被保存, 它被应用于从HEX文件读取来的随后的记录 .段地址保持有效, 直到它被另外一个扩展地址记录所改变。

通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数 据记录的绝对存储器地址。

hex文件格式,HEX文件格式(HEX文件格式解析)

4 部分实现代码

int Hex_Parse(TStringList *m_pDatFile, BYTE *updata_pack_buf){ unsigned int prev_addr = 0xFFFFFFFF; int prev_len = 0; unsigned int cur_addr = 0; int extend_addr_flag = 0; //0-无 2-扩展段 4-扩展线性地址 unsigned int extend_p_addr = 0; unsigned int extend_line_addr = 0; int cur_updata_pack_line_pos = 0; //往updata_pack里面添加数据时的偏移 int cur_hex_line = 0; //当前hex文件操作的行数 for(int i=0; iCount; i++) { if(m_pDatFile->Strings[i] == "") { continue; } Str2DigH(m_pDatFile->Strings[i].Delete(1, 1), hex_data_line[i].buf); switch(hex_data_line[i].bits.flag) { case 0x00: //数据 if(extend_addr_flag == 0) { if(prev_addr == 0) //直接添加进去 { //拷贝数据 memcpy(updata_pack_buf, hex_data_line[i].bits.Prog_Data, hex_data_line[i].bits.len); cur_updata_pack_line_pos += hex_data_line[i].bits.len; prev_len = hex_data_line[i].bits.len; prev_addr = 0; prev_addr |= hex_data_line[i].bits.Addr[0]; prev_addr <<= 8; prev_addr |= hex_data_line[i].bits.Addr[1]; break; } else //与上一个地址比较,看之间是否需要补0xFF { cur_addr = 0; cur_addr |= hex_data_line[i].bits.Addr[0]; cur_addr <<= 8; cur_addr |= hex_data_line[i].bits.Addr[1]; } } else if(extend_addr_flag == 2) { cur_addr = 0; cur_addr |= hex_data_line[i].bits.Addr[0]; cur_addr <<= 8; cur_addr |= hex_data_line[i].bits.Addr[1]; cur_addr = cur_addr | (extend_p_addr<<4); if(prev_addr == 0xFFFFFFFF) prev_addr = cur_addr; } else if(extend_addr_flag == 4) { cur_addr = 0; cur_addr |= hex_data_line[i].bits.Addr[0]; cur_addr <<= 8; cur_addr |= hex_data_line[i].bits.Addr[1]; cur_addr = cur_addr | (extend_line_addr<<16); if(boot_addr_start == 0xFFFFFFFF) boot_addr_start = cur_addr; if(prev_addr == 0xFFFFFFFF) prev_addr = cur_addr; } if(cur_addr-prev_addr == prev_len) { memcpy(updata_pack_buf+cur_updata_pack_line_pos, hex_data_line[i].bits.Prog_Data, hex_data_line[i].bits.len); cur_updata_pack_line_pos += hex_data_line[i].bits.len; prev_len = hex_data_line[i].bits.len; prev_addr = cur_addr; } else //需要补0xFF { memset(updata_pack_buf+cur_updata_pack_line_pos, FILL_BYTE, cur_addr-prev_addr-prev_len); cur_updata_pack_line_pos = cur_updata_pack_line_pos + cur_addr-prev_addr-prev_len; memcpy(updata_pack_buf+cur_updata_pack_line_pos, hex_data_line[i].bits.Prog_Data, hex_data_line[i].bits.len); cur_updata_pack_line_pos += hex_data_line[i].bits.len; prev_len = hex_data_line[i].bits.len; prev_addr = cur_addr; } if(prev_addr >= app_addr_end) return cur_updata_pack_line_pos; break; case 0x01: //文件结束 return cur_updata_pack_line_pos; break; case 0x02: //扩展段地址记录 extend_addr_flag = 2; extend_p_addr = 0; extend_p_addr |= hex_data_line[i].bits.Prog_Data[0]; extend_p_addr <<= 8; extend_p_addr |= hex_data_line[i].bits.Prog_Data[1]; break; case 0x04: //扩展线性地址记录 extend_addr_flag = 4; extend_line_addr = 0; extend_line_addr |= hex_data_line[i].bits.Prog_Data[0]; extend_line_addr <<= 8; extend_line_addr |= hex_data_line[i].bits.Prog_Data[1]; break; } }}

本文关键词:hex文件格式转换,hex文件下载,hex文件格式 dsp,keil5怎么生成hex文件格式,hex文件格式解析。这就是关于《hex文件格式,HEX文件格式(HEX文件格式解析)》的所有内容,希望对您能有所帮助!

本文链接:https://bk.89qw.com/a-541460

最近发表
网站分类