<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>文件格式 on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/</link>
    <description>Recent content in 文件格式 on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 21 Jul 2022 06:00:53 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>BIN、HEX、AXF和ELF的区别</title>
      <link>https://fan-pengfei.top/posts/binhexaxf%E5%92%8Celf%E7%9A%84%E5%8C%BA%E5%88%AB/</link>
      <pubDate>Thu, 21 Jul 2022 06:00:53 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/binhexaxf%E5%92%8Celf%E7%9A%84%E5%8C%BA%E5%88%AB/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;几种常见格式的区别；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一bin文件&#34;&gt;一、bin文件&lt;/h2&gt;
&lt;p&gt;Bin文件是最纯粹的二进制机器代码, 或者说是”顺序格式”。按照assembly code顺序翻译成binary machine  code，内部没有地址标记。&lt;strong&gt;Bin是直接的内存映象表示&lt;/strong&gt;，二进制文件大小即为文件所包含的数据的实际大小。&lt;/p&gt;
&lt;p&gt;BIN文件就是直接的二进制文件，一般用编程器烧写时从地址0x00开始，而如果下载运行，则下载到编译时的地址即可。&lt;strong&gt;可以直接在裸机上运行。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;二hex文件&#34;&gt;二、hex文件&lt;/h2&gt;
&lt;p&gt;Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。 就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示。&lt;/p&gt;
&lt;p&gt;HEX文件由记录（RECORD）组成。在HEX文件里面，每一行代表一个记录。每条记录都由一个冒号“:”打头，其格式如下：&lt;/p&gt;
&lt;h3 id=&#34;文件格式&#34;&gt;文件格式：&lt;/h3&gt;
&lt;p&gt;:BBAAAATTHHHH…HHHHCC　&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;含义分别如下：&lt;/strong&gt;　&lt;/p&gt;
&lt;p&gt;BB：字节个数；
AAAA：数据记录的开始地址，高位在前，低位在后；
TT: Type ；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Type：
00数据记录，用来记录数据；01记录结束，放在文件末尾，用来标识文件结束；02用来标识扩展段地址的记录；04扩展地址记录(表示32位地址的前缀)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;HHHH：一个字(Word)的数据记录,高字节在前,低字节在后；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TT之后共有 BB/2 个字的数据 。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CC: 占据一个Byte的CheckSum；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;举例：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每行中的数据并不是一定有的，第二个字节数据长度为0，那么这行就没有数据。&lt;/p&gt;
&lt;p&gt;由于每行标识数据地址的只有2Byte，所以最大只能到64K，为了可以保存高地址的数据，就有了Extended Linear Address Record。如果这行的数据类型是0x04，那么，这行的数据就是随后数据的基地址。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
:00000001FF&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第一行，是Extended Linear Address Record，里面的数据，也就是基地址是0x0004；&lt;/p&gt;
&lt;p&gt;第二行是Data  Record，里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为  &lt;strong&gt;(0x0004 &amp;laquo; 16) |  0x0000&lt;/strong&gt;，也就是写入FLASH的0x40000这个地址。&lt;/p&gt;
&lt;p&gt;同样，第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候，文件中就会出现多个Extended Linear Address Record。&lt;/p&gt;
&lt;p&gt;校验值：每一行的最后一个值为此行数据的校验和。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0；
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;校验和的算法为：计算从0x3A 以后（不包括0x3A）的所有各字节的和模256的余。即各字节二进制算术和，不计超过256的溢出值，然后用0x100减去这个算数累加和，得出得值就是此行得校验和。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如手头的STM32 HEX 第一行 020000040800F2；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;End of File Record 行是每一个HEX文件的最后一行。例如：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
