[C/C++]Hex文件和Bin文件的关系_hex文件和bin文件有什么区别_Maple_Leaf_15的博客-程序员宅基地

技术标签: C/C++  

背景

从学习单片机以来,在Keil下的烧写都是把.hex文件烧写到单片机内部Flash,对于.hex文件的格式和烧写流程都没有深究。直到需要了解IAP(In Application Programming,即脱离JLink等烧写器进行在线升级)的时候,才发现.hex文件不能作为被直接下载的文件格式,只能用.bin文件代替。下面简单说下这两个文件之间的关联。

Hex文件的样子

这里参考了另一篇文章的内容。
Hex文件打开后每一行称为一个“记录(record)”,每行记录按照同样的结构包含了5个域(且每行以冒号开头):
记录的域的结构
每个域的含义
类型域的说明
根据以上图片知道,一个hex文件最后一行中的记录类型应该是’01’、表示文件结束。
为此写了个简单的程序并用VSCode打开生成的hex:
只有简单的几个常量数组
在这里插入图片描述
可以看到最后一行的记录类型域是’01’、表示文件结束。

这里插一句:第一行的记录类型域是’04’,表示“扩展线性地址记录”;倒数第二行的’05’表示“线性地址开始记录”,现在还不懂是什么意思…
在这里插入图片描述

Bin文件的样子

bin文件是最干净、没有地址信息等额外信息的文件,直接就是可以跑在单片机中机器码(包括程序和数据)。从下面可以看到C源码中**“A char string for see how ASCII char stored in hex and bin”**和另外的字符串被直接放在bin文件的最后(左边白色是bin文件的数据、右边是部分对应的ASCII码,其中控制字符和非ASCII码都显示为"."):
对应的bin文件

两个文件大小对比

hex比bin大
这个简单的程序生成的hex比bin大一倍多(3KB vs 1KB)。
因为hex包含很多额外信息(从截图来看,一行记录最多只能包含16字节的有效数据,也就是hex文件要给bin文件中每16字节增加5字节的信息和1字节的冒号…咦?那不至于两倍多?可能还有别的占存储空间的地方?不清楚…)。
编译另外一个程序得到的结果也是如此(22KB vs 8KB):
在这里插入图片描述
对于hex比bin大很多的原因,这篇文章提到(但这个理解是错误的!):
在这里插入图片描述
该作者的意思是“hex文件把C源码中的每个十六进制数的都当做字符串来处理”——但实际并不是如此,下图可以看出我C源码中的int数组,每个int元素都直接存进了hex文件,它们并没有转化为这些数字对应的ASCII码(如’23’对应的ASCII码应该是’32 33’)
int数组
hex文件的实际数据
bin文件的实际数据

什么时候用hex什么时候用bin呢?

还是引用这里的描述

Hex文件和Bin文件的存在价值:
从上面的介绍中,我们发现Hex文件中每行的内容,就像我们发送串口数据的数据帧,并且最后一行还指示出文件结束了。我们得出hex文件的两个优点:

1. 使用ASCII文本保存固件信息,方便查看一些固件内容;
2. 通过文件每行的校验和与最后一行的文件结束标志,在文件的传输与保存过程中能够发现固件是否完整。

Hex文件有更好的可读性,最重要的是hex文件能够保证固件在保存与传输时的完整性。因此hex文件更适用于保存与传输。而Bin文件是纯二进制文件,内部只包含程序编译后的机器码和变量数据。当文件损坏时,我们也无法知道文件已损坏。不过Bin文件作为固件的最终形式,在使用串口下载程序或者远程升级时,是不可替代的。

最后有一个很好的问题:既然hex和bin在内容上相差了一些额外的信息、而且bin的数据才是单片机最终可见的数据,那hex的额外信息什么时候去掉的呢?
答案是:是在使用JLink或者SWD烧录器给烧录代码时。烧录器上的程序把这些信息去除的。那么可以这样说:烧录hex文件仅在有烧录器的情况使用,否则如果是通过串口或普通的通讯接口,则只能使用bin文件。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Maple_Leaf_15/article/details/100809490

智能推荐

java disjoint_java – Union Find算法的应用(Disjoint Set)_疯癫的A兵者的博客-程序员宅基地

要发生什么事情并不难.事实上非常聪明!让我们来看一个更复杂的例子:a / b = 2.0, b / c = 3.0, c / d = 4.0, d / e = 5.0在第一步(由UnionFind uf = new UnionFind(set)触发的MakeSet)中,每个元素都设置为它自己的父元素,并且所有等级都设置为1.0:parent(a) = a, rank(a) = 1.0...pare...

精通IPFS:IPFS保存内容之下篇_BlackFirefly的博客-程序员宅基地

在上一篇文章中,我们指出在 builder/builder.js 文件中调用调用 pull 函数进行保存文件,这篇文章我们就来详细研究下这个过程。1.设置源流为 file.content。2.调用 chunker 流,对保存的内容进行分块。通过前面的文章,我们知道 chunker 流的默认实现为 chunker/fixed-size.js,它是一个 pu...

cpp linux unistd.h,任何人都有在Ubuntu上找不到unistd.h的情况?_普二丁的博客-程序员宅基地

我有一个邪恶的时间试图找到我的系统中的错误。这实际上是 让我发疯。系统:Ubuntu 16.04 LTS,gcc & g ++ 4.9,5.3 5.4可用。任何人都有在Ubuntu上找不到unistd.h的情况?本质上我试图为点云注册编译一些代码,我没有更新我的机器,我开始看到Boost出于某种原因禁用了线程,产生了多个错误,无法找到线程库。我回头追踪了一部分boost代码,看GLib的定..._unistd.h头文件找不到

几乎没人教你的用poi导出如此复杂的考勤表_复杂考勤表_望远烬的博客-程序员宅基地

先上效果图标题里的部门隐掉了,其实是有部门名称的为保护隐私人员姓名也做了处理这种考勤表相对复杂一些,看需求情况,有需求的可继续看下去废话不多说 上代码1.查询考勤表数据的方法/***查询考勤数据并将数据交给工具类执行*/public void expAttendanceExcel() { Employee employee = (Employee) getRequest().getSession().getAttribute(MyConstants.loginEmployee);_复杂考勤表

ROS学习笔记10:TF坐标变换(ROS常用组件)_csdn odom tf坐标设置_蓝黑艾伦的博客-程序员宅基地

旋转参数的第一种命令格式使用以弧度为单位的yaw、pitch、roll角度(yaw是围绕z轴旋转的偏航角,pitch是围绕y轴旋转的俯仰角,roll是围绕x轴旋转的翻滚角),第二种命令格式使用四元数表达旋转角度。机器人本体和机器人的工作环境中往往存在大量的组件元素,在机器人设计和应用中会涉及不同组件的位置和姿态,这就需要引入坐标系和坐标变换的概念。可视化系统当中的所有tf的关系,监听5s,把5s之内所有坐标系之间的关系保存下来,并生成一个pdf。(2)机器人夹取的物体相对于机器人中心坐标系的位置;_csdn odom tf坐标设置

【React】react学习笔记10-兄弟组件间的传值_修改兄弟组件的值_the_fool_的博客-程序员宅基地

上一篇博文简述了脚手架的使用,以及在ws中的简单配置,详细的配置方法就不讲了,可能有很多细节,在日常使用中发掘就好。然后是脚手架的项目结构以及之间的联系,这个完全可以自己找出来,再不济就百度一下就好。  今天记录一下组件之间的传值问题,特别是兄弟组件的传值,真的是为难了我好久的一个问题:要做啥呢?:方便兄弟组件中传值,我知道的实现方式有两种,一种是使用React Context,..._修改兄弟组件的值

随便推点

超简易python实现RSA加解密_python导入rsa库是不是要下载提前_黑仔丶的博客-程序员宅基地

What:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。环境Windows10、python3.8、pycharm步骤熟悉RSA加解密流程、和概念导入RSA库(导入前先安装pip install rsa)熟悉rsa库__all..._python导入rsa库是不是要下载提前

android studio sign apk_shy_app_2023...apk._ccq282738的博客-程序员宅基地

官方文档:https://developer.Android.com/tools/publishing/app-signing.html1. 默认为debug mode,使用的签名文件在: $HOME/.android/debug.keystore2. Release Mode 签名: build.gradle: [_shy_app_2023...apk.

基于STC单片机的排队管理系统的设计_stc15的无线排队取餐系统_xlhtracy的博客-程序员宅基地

摘要:为改善营业窗口的服务质量和工作效率,解决枯燥无序的排队问题,采用STC89C52单片机控制语音芯片、打印机、LCD显示屏来模拟人工叫号过程,完成号码的打印、存储、显示及播报工作;采用MAX485扩展RS-485总线接口,实现分布式串行通信。该系统能满足简单的排队需求,具有开发成本低,占用空间小等优点,有较好的市场应用前景。关键词:排队管理系统;STC单片机;语音芯片;串行通信_stc15的无线排队取餐系统

access 合并多行字符串_数据文件合并与拆分-程序员宅基地

在数据处理业务中,经常要把文件结构相同或近似相同的数据文件合并成一个文件,或者将一个比较大的数据文件拆分成小的数据文件。本文将介绍文本文件和 Excel 文件合并及拆分会遇到的几种情况,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,SPL 中有完善的文件导入、导出及目录操作函数,非常适合做数据文件的合并及拆分工作。一、 文件合并1. 同构文本文件合并在某个..._access 分组 后文本合并

Android中SQLite使用及DataBase管理_lny23的博客-程序员宅基地

在实际项目编码中,大家可能经常用到sharepreference和sqlite用于数据存储,其底层原理都是以文件的形式进行存储。今天我们就来讲讲sqlite存储的使用。使用过数据库的小伙伴们对sqlite的使用应该能够很快上手。见代码。在操作sqlite数据库时,一共用到三个类:SQLiteOpenHelper,SQLiteDatabase,Cursor(结果集)。一共包含五种数据类型:NULL,

Java,PHP RSA加密解密,分段加解密及RSA签名_rsa2048签名长度_xx3020的博客-程序员宅基地

对接第三方支付系统接口,为这通信的安全性,通常有MD5签名,RSA签名为主,今天主要讲解RSA加解密及签名。 RSA密钥长度有1024和2048位的,由于RSA加密的特殊性,文本内容过长不进行分段加密的话会出来加密失败 1024加密长度为:117,解密长度为:128; 2048加密长度为:245,解密长度为:256,这个地方特别需要注意,根据密钥长度修改不同的参数值JAVA RSA加解密工具类源码:package com.pay.utils;import java.io.ByteArrayO_rsa2048签名长度

推荐文章

热门文章

相关标签