Hex、Bin文件解读

hex文件

做过单片机开发的朋友应该对hex和bin文件都比较眼熟了,但你是否真正理解这两种文件的区别和联系吗?今天我想总结一下,做个备忘。水平所限,如有疏漏,欢迎指正。

简单来说,我们的源代码经过单片机编译器编译后,会输出只有CPU能识别的二进制机器码,这也就是bin文件里面的内容。bin文件需要烧写到Flash(Rom)里才能运行。那这些二进制数据应该怎么烧写以及烧写到Flash里的哪块区域呢?这就需要hex文件登场了。所以,也可以这样说,hex文件是bin文件的详细描述,里面添加了二进制数据在Flash中的对应区域地址等信息。

首先要明确一点,bin文件是二进制(也可以说是16进制)文件,但是hex文件可是文本文件(ASSICII格式),并且内容是以行为单位组织的。每两个字符表示16进制的值,比如,bin中的一个字节数据0xFF,在hex文件中表示为字符串“FF”,占两个字节,所以hex文件比bin文件要大很多。下面重点说一下hex文件的格式,不同编译器输出的hex文件可能会稍微有点不同,但基本格式都是一样的,它包含这几部分:

Head + Len + Offset + Type + Data + Checksum
  • Head
    占1个字符,固定为冒号“:”。

  • Len
    占2个字符,其转化成16机制数的值代表Data域的字节数长度。

  • Offset
    占4个字符,代表地址偏移数。

  • Type
    占2个字符,用来表示本行内容的类别,它有6种取值:

    1. “00”:数据记录,用来记录bin文件中的数据,Hex文件的大部分内容都是数据记录
    2. “01”:文件结束记录,用来标识文件结束,放在文件的最后,标识Hex文件的结尾
    3. “02”:扩展段地址记录,用来标识扩展段地址的记录
    4. “03”:开始段地址记录,开始段地址记录
    5. “04”:扩展线性地址记录,用来标识扩展线性地址的记录
    6. “05”:开始线性地址记录,开始线性地址记录
  • Data
    占Len*2个字符,代表bin文件中的数据。

  • Checksum
    占2个字符,代表本行数据的检验码,计算方法为:检验和 = 0xFF & (0x100 - 冒号之后的各字节数据的累加和)。

单纯用文字讲清楚hex的每部分的含义比较抽象,尤其是Type的分类,不好描述,咱就举例子说明吧,这样最简单明了。针对6种Type,每1类1个例子,对照结构来分析:

  1. : 10 01F0 00 C0E0C0D075D000C000C007309904C299 DB
    Type为“00”,所以这一行为数据记录;长度为0x10(即16),可以数一下Data段确实为16个字节;检验码为DB,按照计算公式算出来也没毛病;Offset为0x01F0,如果本行前面没有扩展段地址记录或扩展线性地址记录,则表示Data域的数据烧写到Flash的地址0x01F0处,如果前面有这两类记录,其意义下面再说。

  2. : 00 0000 01 FF
    Type为“01”,表示这是hex文件结尾,在最后一行。

  3. : 02 0010 02 0010 24
    Type为“02”,所以这一行为扩展段地址记录,扩展段地址为0x0010,它表示该行以后的数据记录烧写地址为:0x0010 x 0x0F + Offset。如果1中的那行数据之前有这个扩展段地址记录,那么1中的数据烧写地址变为:0x0010 x 0x0F + 0x01F0 = 0x02E0。

  4. : 04 0000 03 00003800 C1
    Type为“03”,表示该行为开始段地址记录,这一类很少见,我在我的hex文件中没找到,写一个网上的例子,它指定程序起始执行地址,对于80x86处理器,可指定CS:IP寄存器的初始内容,Offset字段是0x0000,Len始终为4,Data的前两个字节代表CS寄存器的值,后两个字节代表IP值。

  5. : 02 0000 04 0800 F2
    Type为“04”,表示该行为扩展线性地址记录。因为Offset只有两个字节,表示的地址范围有线,所以对于空间比较大的情况,可以用“04”指定扩展地址,表示地址的高位,这样地址就可以用4个字节表示了。本例中指定的地址高位为0x0800,如果1中的那行数据之前有这个扩展线性地址记录,那么1中的数据烧写地址变为:0x0800 << 0x0F + 0x01F0 = 0x080002E0。

  6. : 04 0000 05 08000189 65
    Type为“05”,表示该行为开始线性地址记录,一般表示程序的入口地址,比如该例子中的地址为0x08000189,可以在Map文件中找到。

说到底,其实烧写工具就是根据hex文件的描述,get到程序数据和地址,然后逐个烧写到Flash中对应的区域。好了,先写这么多。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358