美妙人生的关键在于你能迷上什么东西!|

HuDaXia

园龄:6年3个月粉丝:9关注:3

Hex文件格式解析

一、介绍

BIN文件和HEX文件是两种常见的文件格式,尤其在嵌入式系统和软件开发领域有广泛应用。以下是对这两种文件的详细介绍以及它们之间的区别:

BIN文件介绍

  1. 定义:BIN文件是一种二进制文件格式,它通常包含了程序执行所需的机器代码。
  2. 用途:在不同的上下文中,BIN文件有不同的用途和意义。在操作系统中,BIN文件通常指的是可执行文件,包含已经编译好的机器代码,可以直接在操作系统上运行。在嵌入式系统领域,BIN文件通常指的是固件或引导加载器文件,包含了将要烧录到微控制器或闪存芯片中的二进制数据。
  3. 结构:BIN文件的结构取决于其用途和创建它的工具。对于可执行文件,它通常包含头部信息、代码段、数据段和其他资源。对于嵌入式系统的BIN文件,结构可能更为简单,通常只包含一系列将要写入到特定内存地址的数据字节。
  4. 查看与编辑:BIN文件是二进制格式,不适合直接用文本编辑器打开,需要特定的工具或软件来查看或编辑。

HEX文件介绍

  1. 定义:HEX文件是Intel规定的一种标准文件格式,也称为Intel HEX。此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。
  2. 结构:HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。每行以冒号开头,内容全部为16进制码。它包含了地址信息、数据类型、数据长度、数据字段和校验码等部分。
  3. 记录类型:HEX文件由不同的记录类型组成,包括数据记录、文件结束标识、扩展线性地址记录和扩展段地址记录等。这些记录类型用于提供地址信息和数据内容。
  4. 用途:HEX文件主要用于保存单片机固件和其他需要烧录到存储器中的程序和数据。

BIN文件和HEX文件的区别

  1. 地址信息:HEX文件包含地址信息,而BIN文件只包含数据本身。在烧写或下载时,HEX文件不需要用户指定地址,因为其内部已经包含了地址信息。而烧写BIN文件时,用户需要指定烧录的地址信息。
  2. 文件大小:HEX文件是用ASCII码来表示二进制的数值,因此其文件大小通常是BIN文件的两倍或更多。例如,一个8位的二进制数值在HEX文件中需要两个ASCII字符来表示。
  3. 格式与可读性:HEX文件是ASCII文本文件,具有可读性,可以用文本编辑器打开查看。而BIN文件是二进制文件,不可直接用文本编辑器打开查看。
  4. 应用场景:HEX文件主要用于需要包含地址信息的场景,如单片机固件烧录。而BIN文件则更常用于直接执行或加载到内存中的场景,如操作系统中的可执行文件或嵌入式系统中的固件更新。

二、intel HEX文件格式

intel HEX文件规范

  1. 冒号(:):每行的开始都是一个冒号字符,表示该行是Intel HEX格式的一部分。
  2. 字节计数(Byte Count):冒号之后是两个十六进制数字,表示该行中数据字节的数量(不包括校验和字节)。对于第一行,这个值通常是00(如果第一行只包含文件类型信息),或者是02(如果第一行包含扩展段地址信息)。
  3. 地址(Address):接下来是四个十六进制数字,表示数据在目标存储器中的起始地址。对于第一行,这个地址通常是0000。
  4. 记录类型(Record Type):两个十六进制数字,表示记录的类型。Intel HEX文件有几种不同的记录类型,但最常见的是00(数据记录)和01(文件结束记录EOF)。对于第一行,如果它包含文件类型信息(如扩展段地址),则可能是02(扩展段地址记录),否则通常是00(数据记录,但数据字节数为0)。
  5. 数据(Data):根据字节计数,这里会有0到多个十六进制数字,表示实际的数据内容。对于第一行,如果它是扩展段地址记录,这里会包含两个字节的段地址;如果是数据记录且没有数据,则这里为空。
  6. 校验和(Checksum):最后是两个十六进制数字,表示该行前面所有字节(从字节计数开始到数据结束)的按位取反加一的和的补码。用于验证数据的完整性。

00:数据类型标识

表示传输的内容为真实数据,如“:06002000010203040506C5”,表示在0020地址存储6个字节数据【0x010203040506】

01:文件结尾标识

表示文件结尾,基本为固定内容“:00000001FF”

02:扩展段地址

表示地址扩展,地址位[19,4]位,[3,0]位为0,

:020000021008E4

:06102000010203040506B5

:00000001FF

02标识的地址为0x1008,此时地址为0x10080,

00标识第二行的数据地址为0x1020

实际地址为(0x1008<<4+0x1020)

03:起始段地址

标识16bit的CS和IP寄存器的值,在8086cpu中,CS和IP寄存器分别代码代码寄存器和指令寄存器,标识了读取指令的地址

04:扩展线性地址

表示地址扩展,地址位[31,16]位,[15,0]位为0x0000,

:020000041008E2

:06102000010203040506B5

:00000001FF

02标识的地址为0x1008,此时地址为0x10080000,

00标识第二行的数据地址为0x1020

实际地址为(0x1008<<16+0x1020)0x10081020

05:起始线性地址

标识32bitEIP寄存器的值,EIP用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加;EIP寄存器与PC寄存器的功能类似,存储下一条要执行的指令地址。

三、转换工具

HexView

  1. 十六进制查看
    • HexView能够轻松查看文件的十六进制码,帮助用户深入了解文件的内部结构。
    • 支持查看任何文件的十六进制编码和ASCII编码,包括Intel-HEX、Motorola S-record等二进制文件或其他特定文件格式。
  1. 数据格式转换
    • 支持多种数据格式的转换,方便用户在不同格式之间进行数据处理。
    • 可以将十六进制数据转换为十进制、八进制、字符串等形式。
  1. 数据编辑与保存
    • 除了查看功能外,HexView还允许用户直接编辑文件的十六进制值。
    • 用户可以对数据进行剪切、填充、合并等操作,并保存编辑后的文件。
  1. 搜索与替换
    • HexView内置搜索功能,可以根据关键词在文件中进行查找。
    • 提供替换功能,便于用户查找和修正数据错误。
  1. 自定义视图配置
    • 用户可以根据自己的需求自定义视图配置,如设置颜色编码、调整显示格式等。
  1. 文件拖放功能
    • 支持文件拖放操作,用户可以直接将文件拖放到HexView中进行查看和编辑。
  1. 脚本处理
    • 支持bat脚本的静默调用处理,方便用户进行批量文件处理。
    • 可以使用脚本指令进行文件的合并、导出等操作。

四、举例说明02扩展段地址和扩展线性地址有什么区别

:020000021000EC
:200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E
:020000040001F9
:200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E
有什么区别

这两组Intel HEX记录的主要区别在于它们使用不同的地址扩展记录类型:02(扩展段地址记录,Extended Segment Address Record)和04(扩展线性地址记录,Extended Linear Address Record)。让我们详细解释它们的区别。

第一组记录

:020000021000EC
:200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E

解释:

  1. :020000021000EC

    • 02:表示这是一个扩展段地址记录。
    • 1000:扩展段地址为0x1000
    • EC:校验和。
  2. :200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E

    • 20:表示有32个字节的数据。
    • 0000:数据记录的起始地址。
    • 00:数据类型是数据记录。
    • 数据:7466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E
    • 3E:校验和。

地址计算

  • 基地址:0x1000 << 4 = 0x10000
  • 数据的起始地址:0x10000 + 0x0000 = 0x10000

第二组记录

:020000040001F9
:200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E

解释:

  1. :020000040001F9

    • 04:表示这是一个扩展线性地址记录。
    • 0001:扩展线性地址为0x0001
    • F9:校验和。
  2. :200000007466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E

    • 20:表示有32个字节的数据。
    • 0000:数据记录的起始地址。
    • 00:数据类型是数据记录。
    • 数据:7466A79D0001000000055E87594C4B5356012E002E01FFFF56022E200000FFFF3E
    • 3E:校验和。

地址计算

  • 基地址:0x0001 << 16 = 0x10000
  • 数据的起始地址:0x10000 + 0x0000 = 0x10000

总结

  • 扩展段地址记录(02:基地址由扩展段地址乘以0x10(左移4位)计算得出,适用于16位地址总线。
  • 扩展线性地址记录(04:基地址由扩展线性地址乘以0x10000(左移16位)计算得出,适用于32位地址总线。

在这段数据中,虽然它们使用不同的记录类型,但它们都将数据加载到相同的绝对地址0x10000

 
 
 
posted @   HuDaXia  阅读(1148)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起