打印

好**。

[复制链接]
21214|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
twentyone|  楼主 | 2007-12-11 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HEX文件和BIN文件是我们经常碰到的2种文件格式。下面简单介绍一下这2种文件格式的区别:


1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身
         在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN
         文件的时候,用户是一定需要指定地址信息的。
         
         
3 - BIN文件格式
         对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。
         
         
4 - HEX文件格式
         HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:
         +---------------------------------------------------------------+
         |   RECORD  | RECLEN |  LOAD  | RECTYPE | INFO or DATA | CHKSUM |
         |  MARK ':' |        | OFFSET |         |              |        |
         +---------------------------------------------------------------+
         |  1-byte   | 1-byte | 2-byte | 1-byte  |    n-byte    | 1-byte |
         +---------------------------------------------------------------+
         
         记录类型包括:
         '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
         '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
         '04' Extended Linear Address Record: 用来标识扩展线性地址的记录
         '02' Extended Segment Address Record: 用来标识扩展段地址的记录
         
         在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。
         对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。
         
         数据记录的具体格式:
         +---------------------------------------------------------------+
         |   RECORD  | RECLEN |  LOAD  | RECTYPE | INFO or DATA | CHKSUM |
         |  MARK ':' |        | OFFSET |  '00'   |              |        |
         +---------------------------------------------------------------+
         |  1-byte   | 1-byte | 2-byte | 1-byte  |    n-byte    | 1-byte |
         +---------------------------------------------------------------+         
         
         看个例子:
        :020000040000FA
        :10000400FF00A0E314209FE5001092E5011092E5A3
        :00000001FF         
       
        对上面的HEX文件进行分析:
        第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0000,校验和为
        FA。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为0X0000。后面的数据记录都以这个地址为基
        地址。
        第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。
        数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X0000,加上OFFSET,
        这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004.
        第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识
        文件的结尾。
       
        在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x4
           

4 - HEX文件和BIN文件大小有区别
     HEX文件是用ASCII来表示二进制的数值。例如一般8-BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符'3'
     和字符'F',每个字符需要一个BYTE,所以HEX文件需要 > 2倍的空间。
     对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件
     大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。


要想详细了解HEX文件格式,请GOOGLE INTEL HEX,就能找到详细的PDF文档。
评分
参与人数 1威望 +5 收起 理由
lfjwfm + 5 赞一个!

相关帖子

沙发
lpf336| | 2007-12-11 12:54 | 只看该作者

沙发

使用特权

评论回复
板凳
dld2| | 2007-12-11 12:56 | 只看该作者

板凳

使用特权

评论回复
地板
yatelanda| | 2007-12-11 13:00 | 只看该作者

知识贡献

使用特权

评论回复
5
王紫豪| | 2007-12-11 13:27 | 只看该作者

不错!

使用特权

评论回复
6
zhiwei| | 2007-12-11 20:46 | 只看该作者

另外

HEX对于那些中间空白区域会忽略除非填充数据;但是BIN就会全部填充。
比如你的单片机空间128kB,你在定义一个常量字节数据放到最后,那么BIN实际大小就必须128kB那么大了;而Hex中间没有定义数据的地方就是空的,不会生产记录。

使用特权

评论回复
7
twentyone|  楼主 | 2007-12-11 22:25 | 只看该作者

谢谢ZHIWEI的补充

THX A LOT

使用特权

评论回复
8
yatelanda| | 2007-12-12 09:04 | 只看该作者

回6楼

呵呵,烧写程序直接从最后一个字节(满足对齐条件哈)开始烧写,bin文件完全可以只有一个字节大小啊.

你说的这种情况,通常只适合那些低档的单片机,它们烧写程序必须从flash或EEPROM的第一个字节开始.这因为芯片或烧写工具做得不够灵活.

程序大到一定程序的时候, 通常会采用分区的原则,比如,前面256K留给code,接下来分别是字库,文本资源,图片资源,等等。某一部分发生变化,则只更新这一部分。比如代码经常改,但资源基本不用改。这样烧写就很省时间。如果不能做到从任意位置(相对任意哈)开始烧写,这一切都是空想。

hex文件,s3文件相当于多个bin文件加上它们各自的目标起始地址。

使用特权

评论回复
9
wangharry| | 2007-12-13 22:44 | 只看该作者

使用特权

评论回复
10
hotpower| | 2007-12-14 07:52 | 只看该作者

哈哈~~~这个应该要搞清楚的~~~

procedure TForm1.SaveHexFile(FileName: string);
var
  FileLen: Integer;
  HexFile: TextFile;
  str, s: String;
  i, k, n, address: Integer;
  crc: Byte;
begin
  if FileExists(FileName) then
  begin
    if Application.MessageBox('请您确认是否覆盖???', '系统提示:写入配置文件!!!', MB_YESNO) = IDNO then
      Exit;
    if Application.MessageBox('请您再次确认是否覆盖???', '系统提示:写入配置文件!!!', MB_YESNO) = IDNO then
      Exit;
  end;
  FileLen := StrToInt(Edit4.Text);//文件长度
  AssignFile(HexFile, FileName);
  ReWrite(HexFile);
  try
    Writeln(HexFile, ':0400000500000000F7');
    Writeln(HexFile, ':020000040000FA');

    for i := 1 to StringGrid1.RowCount - 1 do
    begin
      str := '';
      n := 0;
      for k := 1 to 16 do
      begin
        s := Trim(StringGrid1.Cells[k , i]);
        if s = '' then
          break;
        str := str + s;
        n := n + 1;
      end;
      if n = 0 then break;
      str := ':' + IntToHex(n, 2)
                 + IntToHex((i - 1) * 16, 4)
                 + '00'
                 + str;
      crc := GetStrCrc(str);
      crc := crc xor $ff;
      crc := crc + 1;
      str := str + intToHex(crc, 2);
      Writeln(HexFile, str);
    end;
    Writeln(HexFile, ':00000001FF');
  finally
    CloseFile(HexFile);
  end;
end;

相关链接:http://blog.**/hotpower/68894/message.aspx

使用特权

评论回复
11
平常人| | 2007-12-14 08:43 | 只看该作者

谢谢楼主澄清解释,虽然很多人都在用,但却不是所有人都

HEX格式好像最早由Intel创造的?!

使用特权

评论回复
12
ark338| | 2007-12-14 09:34 | 只看该作者

呵呵,不错~学习了~

这些细节的东西以前还真没有注意过。

使用特权

评论回复
13
luying7223| | 2007-12-14 10:22 | 只看该作者

谢谢,学习了

使用特权

评论回复
14
端木| | 2007-12-14 20:15 | 只看该作者

好**。

GOOD!

使用特权

评论回复
15
skyfighter| | 2008-3-18 12:31 | 只看该作者

很好的一篇内容!现在要积累呀!

很好的**!

使用特权

评论回复
16
sz_kd| | 2008-3-18 13:10 | 只看该作者

学习

使用特权

评论回复
17
wufei608| | 2012-10-27 17:24 | 只看该作者
好东西,收藏了

使用特权

评论回复
18
mengbinya| | 2012-10-28 12:36 | 只看该作者
好资料,谢谢楼主

使用特权

评论回复
19
yuchl| | 2013-2-28 14:25 | 只看该作者
好资料,很详细。

使用特权

评论回复
20
arm菜鸟人| | 2013-2-28 16:11 | 只看该作者
不错~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

203

帖子

0

粉丝