文/Edward“Hex文件里面究竟存储的是什么内容,为什么将它一顿操作后下载到单片机里面之后就可以使得单片机神奇的按照我们想要的方式工作起来呢?”好奇的你有没有思考过这个问题?今天我们就来展开这个Hex文件的内容,一探到底,揭开它神秘的面纱。  认识它我们一般将Hex文件称为单片机上面的可执行文件,或者叫它十六进制文件。Hex的由来也是截取了十六进制英文“hexadecimal”的前面三个字母。其实,可以下载到单片机内部的可执行文件不止Hex文件一种,其它的还有二进制文件,elf文件等,但是不可置否的是,现在Hex文件是使用最多的单片机可执行文件格式。Hex 全称Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个Hex记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。  打开它打开Hex文件,非常简单,你可以使用电脑上面自带的记事本工具打开,也可以使用我们最常用的J-flash去打开,也可以使用notepad++去打开。如图1所示,使用记事本去打开Hex文件。图1 记事本打开Hex文件记事本是我们所能接触到的最方便的打开Hex文件的工具,除此之外,Notepad++也可以打开Hex文件。用Notepad++打开Hex文件,它除了可以将Hex文件的有效信息都显示出来之外,还可以根据Hex文件约定的格式,分别高亮出不同颜色,以代表不同的字段信息。使读者更为醒目,如图2所示。图2 Notepad++打开Hex文件当然最专业的打开Hex文件的工具,还是J-flash,因为它是专门用来为单片机烧写程序的软件。如图3所示。图3 J-flash打开Hex文件问题思考1使用上面的三个软件中的任意软件都可以打开并且查看Hex文件。但是有好奇心强的读者就可能会问了,图3中右边那一串看着像乱码的东西到底是什么呢?上面还写着ASCII。其实这上面表示的是Hex文件中每一个十六进制字符所对应的ASCII码,如果这个字符对应ASCII码的不在打印区内,就用“.”代替。问题思考2回答到这里,可能深入思考的读者又会有问题了,我们使用Notepad++或者记事本这样的工具打开一个文件,它们最终会以对应的编码去打开。比如我们打开一个文件,这个文件里面存储了一个二进制数值0x41,那如果我们使用ASCII码去打开,那么自然而然会将0x41的ASCII码显示出来。反过来说,如果我们使用Notepad++这样子的工具去打开一个Hex文件,而它显示了图2的内容,那么这个Hex文件内部最终存储的难道是这些十六进制数的ASCII码?这个问题答案是,Hex文件是一种以文本形式存储的文件,它不像二进制文件一样以二进制的形式去存储。比如同样一串二进制数字“0500D600D2A9D28C222A”,如果将其存入二进制文件,那么它存入的势必就是“0500D600D2A9D28C222A”这样子的信息了。因此如果我们使用Notepad++这样的工具去打开bin文件,必定多数都是乱码,因为绝大多数二进制以ASCII码打开都显示不了。而同样这串数字如果存入Hex文件中,其实际存储的就是“0500D600D2A9D28C222A”的ASCII码,如0的ASCII码为0x30,5的ASCII码为0x35,依次类推。因此,如果我们以后进行文件的OTA推送时,一定要注意这个问题。而由于存储方式的不同,因此同一份程序如果用Hex文件存储至少比用Bin文件存储要大一倍。那么Hex文件与Bin文件相比,除了易于读取之外,没有很大的优点,为什么我们还要坚持不懈地使用它呢?我们知道,单片机下载程序必要的一个要素就是这个程序下载到单片机的起始地址。Bin文件是不带有任何地址信息的,因此我们下载Bin文件的时候一定要主动地去指明这个起始地址,一旦丢失或者忘记这个地址,程序都将无法正常运行。但是Hex文件它天生就会将程序的地址信息一并记录在内,因此使用Hex文件下载程序会变得更加方便。  解剖它我们还是使用Notepad++来打开Hex文件。如图4所示。图4 打开的Hex文件用Notepad++可以一目了然地看出这个Hex文件每一行数据中的关键字段。接着,我们一起来探索这个文件。首先我们需要知道,一个Hex文件的每一行都是以ASCII码的“:”(0x31)开始的。而每一行Hex文件可以被分成五个关键字段,如图5所示。图5 Hex文件字段从图5中可以看出,Hex文件以每一行为一个整体,定义了数据的长度,数据类型和存储地址:第一个字节 0x02表示本行数据的长度;第二、三字节 0x00 0x00表示本行数据的起始地址;第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。具体的数据类型如表1所示。表1 数据类型字段中的详细解释

字段 名称 含义
'00' Data Rrecord 用来记录数据,HEX文件的大部分记录都是数据记录
'01' End of File Record 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
'02' Extended Segment Address Record 用来标识扩展段地址的记录
'03' Start Segment Address Record 开始段地址记录
'04' Extended Linear Address Record 用来标识扩展线性地址的记录
'05' Start Linear Address Record 开始线性地址记录

然后是数据,0x08 0x00最后一个字节 0xf2为校验和,校验和的算法为:计算 0xf2前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和。Hex文件的数据类型字段中,'04'  '05',都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为::020000040800F2:1000000048B6002085010008B1450008252B0108ED:10001000B9450008C1450008C945000800000000B6:00000001FF     对上面的HEX文件进行分析:

  • 第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0800,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000后面的数据记录都以这个地址为基地址。

  • 第2条记录的长度为10(16),LOAD OFFSET为0000,RECTYPE为00,说明该记录为数据记录。数据为48 B6 00 20 85 01 00 08 B1 45 00 08 25 2B 01 08,共16个BYTE。这个记录的校验和为ED。此时的基地址为0X0800 0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x0800 0000 + 0x0000 = 0x0800 0000.

  • 第3条记录的长度为10(16),LOAD OFFSET为0010,RECTYPE为00,说明该记录为数据记录。数据为B9 45 00 08 C1 45 00 08 C9 45 00 08 00 00 00 00,共16个BYTE。这个记录的校验和为B6。此时的基地址为0X0800 0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000 + 0x0010 = 0x0800 0010.

  • 第4条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

当我们用J-flash去下载Hex文件的时候,这个软件也会如我们分析一样,将整个Hex文件一行行写入到单片机中的特定基地址的偏移值中。

pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...相关推荐

  1. TF卡里删掉文件后内存没变大_双11,TF卡,SD卡,读卡器如何选,看这篇就够了...

    此文章发布已经半年有余,各大厂家推出了很多新的SD卡,且SD卡组织也推出了新的标准,所以这篇文章的内容已经有些过时,还得烦请各位移步到新的文章: 黄昏百分百:TF卡,SD卡,读卡器,USB拓展坞如何选 ...

  2. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  3. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  4. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  5. u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...

    现在,我们日常的生活和工作都是电脑全程陪伴,可以说是离不开电脑了. 也正是因为电脑的功能那么多,而且在保存资料方面,相比纸质资料来讲,确实有十分大的优势! 因此,有许多人都会将一些重要的个人资料或者是 ...

  6. php源码放入iis+mysql+php服务器打开出现乱码_安装了IIS和PHP,运行PHP文件却内部服务器错误...

    如题,我按照步骤安装的应该没问题的,同学也是这样安装的就可以,我的却是500内部服务器错误用集成了Apache+PHP+MySQL+Zend+eAccelerator+PhpMyAdmin的e2php ...

  7. mac 电脑资源库文件夹_如何在Mac上找到您的资料库文件夹

    mac 电脑资源库文件夹 When fixing problems on a Mac, sometimes you need to roll up your sleeves and directly ...

  8. mfc 监控文件操作_实战经验:使用CFileDialog实现多个文件选择

    问题 最近需要实现文件选择的功能,要求是需要弹出系统标准的文件选择对话框,另外,允许用户选择多个文件. 解决方法 MFC中有一个类CFileDialog就是用来做这件事的,而且功能还挺丰富,今天只是使 ...

  9. hosts文件 端口_在Linux系统中使用Vim读写远程文件

    大家好,我是良许. 今天我们讨论一个 Vim 使用技巧--用 Vim 读写远程文件.要实现这个目的,我们需要使用到一个叫 netrw.vim 的插件.从 Vim 7.x 开始,netrw.vim 就被 ...

最新文章

  1. linux学习笔记十四:安装SAMBA(Server Message Block)
  2. C++类class和结构体struct区别
  3. openstack API debug OpenstackEveryProject_CLI,curl_based
  4. 多线程不重复读取数据_别再犯错了,多线程访问同一个资源一定要上锁?
  5. java中原始数据文件的输入
  6. 画图板-- 中点算法画圆
  7. html 标签 r语言,从R中的字符串中删除html标签
  8. IOS中,在两个ViewController之间传值
  9. Linux 修改环境变量
  10. spark-dataframe与rdd的区别
  11. 18、Windows API 图形用户界面(2)
  12. solidworks迈迪设计宝_做非标机械设计必备的辅助工具,如米思米、怡合达、英科宇等...
  13. 爱看小说网源码全站带数据打包ThinkPHP内核小说网站源码
  14. 【操作系统】进程管理
  15. [从头读历史] 第262节 左传 [BC597至BC538]
  16. 【备读学术论文总览】研究方向论文清单
  17. 对话周傲英:数据库人的切肤之痛
  18. Nginx管理(二)
  19. Python语言的33个保留字(记得一定要收藏好哦)
  20. 基于JSP的汽车租赁管理系统的设计与实现

热门文章

  1. 个推通知栏修改_浙大一院五一劳动节放假通知!手机办住院手续!还有这些攻略不能错过!...
  2. 文本挖掘预处理流程总结(1)— 中文
  3. EOS 消息设计(3)并行处理之状态评估
  4. Hyperledger Fabric 智能合约实战 (2)软件安装Docker、 Docker-composer、go
  5. Hyperledger Fabric 链码(2) 接口
  6. [optee_os]-optee中的内核栈、中断栈、abort栈的定义
  7. java小程序死机_求解,刚写的小程序,一运行我机器就死机
  8. 内核和用户模式下进程与线程创建
  9. 软件调试学习笔记(七)—— 单步步入单步步过
  10. 1043 Is It a Binary Search Tree (25 分)【难度: 中 / 知识点: 构造二叉搜索树(BST) 】