16进制文件(HEX)转2进制文件(BIN)小结

  

最近写程序需要把HEX文件转换成BIN文件,查找网上资料总结如下: 
先解析Intel HEX文件格式
1 Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。 Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
2 HEX记录格式。Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域, 它们按以下格式排列[:LLAAAATT[DD…]CC]。每一组字母对应一个不同的域, 每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成, 它们构成一个字节,像下面描述的例子:
(1):每个Intel HEX记录都由冒号开头。
(2)  LL 是数据长度域,它代表记录当中数据字节(DD)的数量。
(3)  AAAA 是地址域,它代表记录当中数据的起始地址。
(4)  TT 是代表HEX记录类型的域,它可能是以下数据当中的一个:
a.         00 – 数据记录(看下面第3点)
b.         01 – 文件结束记录
c.         02 – 扩展段地址记录(看下面第5点)
d.         04 – 扩展线性地址记录(看下面第4点)
(5) DD… 是数据域,它两个字符代表一个字节的数据。一个记录可以有许多数据字节,记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符。
(6) CC 是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。也就是说LLAAAATT[DD…]CC一共的校验和永远为0。如下面的例子:
: 0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0×9D
3 数据记录格式。Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下[:10246200464C5549442050524F46494C4500464C33],其中:
a.         10 是这个记录当中数据字节的数量。
b.         2462 是数据将被下载到存储器当中的地址。
c.         00 是记录类型(数据记录)。
d.         464C…464C是数据。
e.         33 是这个记录的校验和的补足码。
4 扩展线性地址记录(HEX386)格式。扩展线性地址记录也叫作32位地址记录或HEX386记录。这些记录包含数据地址的高16位。扩展线性地址记录总是有两个数据字节,外观如下:02000004FFFFFC],其中:
a.         02 是这个记录当中数据字节的数量。
b.         0000 是地址域,对于扩展线性地址记录,这个域总是0000。
c.         04 是记录类型 04(扩展线性地址记录)。
d.         FFFF 是地址的高16位。
e.         FC 是这个记录的校验和的补足码。
f.          当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。线性地址保持有效,直到它被另外一个扩展地址(扩展段或者扩展线性地址)记录所改变。
g.         通过把记录当中的地址域与被移位(16位)的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址。以下的例子演示了这个过程:
                                      i.              来自数据记录地址域的地址        2462
                                    ii.              扩展线性地址记录的数据域     FFFF0000
                                  iii.              绝对存储器地址                         FFFF2462
5 扩展段地址记录(HEX86)。扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段。扩展段地址记录总是有两个数据字节,外观如下:[: 020000021200EA],其中:
a.         02 是记录当中数据字节的数量。
b.         0000 是地址域,对于扩展段地址记录,这个域总是0000。
c.         02 是记录类型 02(扩展段地址记录)。
d.         1200 是地址段。
e.         FC 是这个记录的校验和的补足码。
f.          当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。线性地址保持有效,直到它被另外一个扩展地址(扩展段或者扩展线性地址)记录所改变。
g.         通过把记录当中的地址域与被移位(16位)的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址。以下的例子演示了这个过程:
                                      i.              来自数据记录地址域的地址        2462
                                    ii.              扩展线性地址记录的数据域     FFFF0
                                  iii.              绝对存储器地址                         102452
6 程序的实现过程,程序的实现过程需要读取两次文件,第一次读取文件主要是读得文件中的最小地址和最大地址,也即可以知道HEX文件中的数据是从那个(低)地址到那个(高)地址的的数据,在这一次可以顺便检验文件中字符的合法性和文件的合法性,为下一次读取文件做好准备。第二次读取主要是转换的过程,你可以先定义一个字节数组(数组的大小为最大地址减最小地址)或者创建一个文件(文件的大小为最大地址减最小地址)然后把数组或者文件写入0xFF(由于0x00在单片机中是有用字节)。然后开始从头读文件,读得一行分析一行并写入数组或文件。注意读得的地址减去第一次得到的最小地址即是在文件或者数组的地址。这样就搞定,下面我会给出一个例子。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值