精华内容
下载资源
问答
  • Hex文件格式解析

    2018-03-28 17:36:05
    Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。 Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后...
    Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。
      Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,真个文件以行为单位,每行以冒号开头,内容全部为16进制码。Hex文件可以按照如下的方式进行拆分来分析其中的内容:
      例如:
      :020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA
      第一个 0x02 为数据长度。
      紧跟着后面的0x00 0x00 为地址。
      再后面的0x04为数据类型,类型共分以下几类:
      '00' Data Record
      '01' End of File Record
      '02' Extended Segment Address Record
      '03' Start Segment Address Record
      '04' Extended Linear Address Record
      '05' Start Linear Address Record
      然后,接着0x04后面的两个 0x00 0x00就是数据。最后一个0xFA是校验码。
      HEX文件的每一行都是这样的格式:
      
    <0x3a>
    [数据长度1Byte]
    [数据地址2Byte]
    [数据类型1Byte]
    [数据nByte]
    [校验1Byte]
    <0x0d>
    <0x0a>
     在例如:
      :1000000018F09FE518F09FE518F09FE518F09FE5C0
      按照上面的数据行格式分析如下:
      
    <0x3a>
    [数据长度1Byte]10
    [数据地址2Byte]00 00
    [数据类型1Byte]00
    [数据nByte]18F09FE518F09FE518F09FE518F09FE5
    [校验1Byte]C0
    <0x0d>
    <0x0a>
     每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。
      由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
      :020000040004F6
      :1000000018F09FE518F09FE518F09FE518F09FE5C0
      :1000100018F09FE5805F20B9F0FF1FE518F09FE51D
      第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为 (0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。同样,第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。
      End of File Record 行是每一个HEX文件的最后一行。例如:
      :00000001FF
      这样的一行数据内容是固定的,数据长度为0,地址为0。
      校验值:每一行的最后一个值为此行数据的校验和。例如:
      :1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0
      :1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D
      校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
     
    如手头的STM32 HEX 第一行 020000040800F2
    start addr  = (0x0800<<16)=0x0800 0000.这个地址就是编译器里面IROM1的Start地址。
    展开全文
  • HEX文件格式解析

    万次阅读 多人点赞 2015-01-31 12:11:32
    Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的...

    Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多 数 EPROM 编 程器或模 拟器使用Intel HEX 文件。

    Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

    一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下:


    Intel HEX 由任意数量的十六 进 制 记录组 成。每 个记录 包含5 个 域, 它们按以下格式排列:

    每一组字母 对应 一 个 不同的域,每一 个 字母 对应 一 个 十六 进 制 编码 的 数 字。每一 个 域由至少 两个 十六 进制 编码数 字 组 成, 它们构 成一 个 字 节 ,就像以下描述的那 样:

    (冒号)每个Intel HEX 记录 都由冒 号开头 ;
    LL 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 ;
    aaaa 是地址域, 它代表 记录当 中 数据的起始地址;
    TT是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:
        00 – 数 据 记录(Data Record
        01 – 文件结 束 记录(End of FileRecord
        02 – 扩展段地址 记录(ExtendedSegment Address Record

    03 – 开始段地址 记录(Start Segment Address Record)
        04 – 扩展 线 性地址 记录(Extended Linear Address Record)

    05 – 开始线性地址 记录(Extended Segment Address Record)
    dd 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和数 据 长 度域(ll) 中指定的 数字相符.
    cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值相加, 以256 为 模 进 行以下 补 足.

    表示为:“[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”

     

    具体根据记录类型分析如下:

    (1)数据记录”00”

    Intel HEX文件由任意数 量以回车换行符结束的数据记录组成数据记录外观如下:
        :10246200464C5549442050524F46494C4500464C33
    其中:10 是这个记录当中 数 据字 节 的 数量.0x10 ;
         2462 是数据 将 被下 载 到存 储 器 当中的地址.0x2462 ;

    00 是记录类型( 数 据 记录).0x00 ;
    464C…464C是 数据.分别代表0x46,0x4C... ;
    33 是这个记录的校 验和0x33计算方法如下:256D-(10H+24H+62H+00H+46H+4CH+55H+49H+44H+20H+50H+52H+4FH+46H+49H+4CH+45H+00H+46H+4CH)/100H=33H;

    (2)文件结束(EOF)”01”

    Intel HEX文件必须以文件结束(EOF) 记录结束这个记录的记录类的值必须是01.EOF 记录 外 观总是如下:
       :00000001FF
    其中:00 是记录当中 数 据字 节 的 数量.
       0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义,被忽略的.0000h 是典型的地址;
       01 是记录类型 01( 文件 结 束 记录)
       FF 是 这个记录 的校 验 和, 计算方法如下: 256D-(00H+00H+00H+01H)=FFH;

    (3)扩展线性地址记录(HEX386) ”04”

    由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear AddressRecord。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。

    扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位扩展线性地址记录总是有两个数据字节,外观如下:
        :02000004FFFFFC

    其中:02 是这个记录当中 数 据字 节 的 数量.
    0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
    04 是记录类型 04( 扩 展 线 性地址 记录)
    FFFF 是地址的高16 位.
    FC 是这个记录的校 验 和, 计算如下: 256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;

    当一 个扩展 线 性地址记录被读 取, 存 储于数据域的扩展线性地址被保存,它被应于

    从 Intel HEX 文件 读取 来 的 随 后的 记录 . 线 性地址保持有效, 到 它 被另外一 个扩址记录 所改 变。

    通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展 线 性地址 记录 的地址 数 据相加

     获 得 数 据 记录 的 绝对 存 储器地址。

    以下的例子演示了这个过 程:

    :0200000480007A    //数据记录的绝对存储器地址高16位为0x8000               

    :100000001D000A00000000000000000000000000C9

    :100010000000000085F170706F0104005D00BD00FC

    第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x8000,第二行是DataRecord,里面的地址值是0x0000。那么数据1D000A00000000000000000000000000(共16个字节)要写入FLASH中的地址为 (0x8000<< 16)| 0x0000,也就是写入FLASH的0x80000000这个地址;第三行的数据写入地址为0x80000010.当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。

    (4)扩展段地址记录(HEX86)“02“

    扩展段地址记录也叫HEX86 记录 , 它包括4-19 位数据地址段. 扩展段地址记总是有两

    个数 据字节 , 外观如下:
    :020000021200EA
    其中:02 是记录当中 数 据字 节 的 数量;
    0000 是地址域. 对于 扩 展段地址 记录 , 这个 域 总是0000;
    02 是记录类型 02( 扩 展段地址 记录);
    1200 是地址段;
    EA 是这个记录的校 验 和;

    当一 个扩 展段地址 记录 被 读 取, 存 储 于 数 据域的 扩 展段地址被保存, 它 被 应 用于 从 Intel HEX 文件 读 取 来的 随 后的 记录 . 段地址保持有效, 直到 它 被另外一 个扩 展地址 记录 所改 变。

    通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展段地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址。
        以下的例子演示了这个过 程..
    来自 数 据 记录地址域的地址          2462
    扩展段地址 记录数据域             +  1200
                                   ---------
    绝对存 储 器地址                   00014462


    Intel HEX 文件例子:
    下面是一个 完整的Intel HEX 文件的例子:
    :10001300AC12AD13AE10AF1112002F8E0E8F0F2244
    :10000300E50B250DF509E50A350CF5081200132259
    :03000000020023D8
    :0C002300787FE4F6D8FD7581130200031D
    :10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
    :04003F00A42EFE22CB
    :00000001FF

    //追加一段

    //-------------贴一段解析的c语言,这才是精华-------------------

    int ParseIHexPerLine(const char *buf,const char *path,int line)
    {
    	unsigned int nbytes=0,addr=0,type=0,i,val,line_chksum;
    	unsigned char data[1024];	
    	unsigned char cksum;
    	const char *s=buf;			
    	if(*s!=':') //第一个为冒号
    	{  
    		fprintf(stderr,"%s:%s: format violation (1)/n",path,line);
    		return(1);  
    	}
    	++s;
    	//接下来的8个字节为数据大小、地址等
    	if(sscanf(s,"%02x%04x%02x",&nbytes,&addr,&type)!=3)
    	{  
    		fprintf(stderr,"%s:%s: format violation (2)/n",path,line);
    		return(1);  
    	}
    	s+=8;
    	//读到的类型
    	if(type==0) //为数据段
    	{
    		if(!(nbytes>=0 && nbytes<1024))
    		{
    			perror("nbyte per line unsupport/n");
    			return(-1);
    		}
    		
    		cksum=nbytes+addr+(addr>>8)+type;
    		//
    		for(i=0; i<nbytes; i++)
    		{
    			val=0;
    			if(sscanf(s,"%02x",&val)!=1)
    			{  
    				fprintf(stderr,"%s:%s: format violation (3)/n",path,line);
    				return(1);
    			}
    			s+=2;
    			data[i]=val;
    			cksum+=val;
    		}
    		//
    		line_chksum=0;
    		if(sscanf(s,"%02x",&line_chksum)!=1)
    		{  
    			fprintf(stderr,"%s:%s: format violation (4)/n",path,line);
    			return(1);  
    		}
    		if((cksum+line_chksum)&0xff)
    		{  
    			fprintf(stderr,"%s:%s: checksum mismatch (%u/%u)/n",
    					cksum,line_chksum);  
    			return(1);  
    		}
    		if(WriteRAM(addr,data,nbytes)) 
    			return(1);  
    	}
    	else if(type==1)
    	{
    		// EOF marker. Oh well, trust it. 
    		return(-1);
    	}
    	else
    	{
    		fprintf(stderr,"%s:%s: Unknown entry type %d/n",type);
    		return(1);
    	}
    	return(0);
    }


    展开全文
  • 前言最近在研究STM32的IAP升级功能,发现大多数的IAP升级时的文件格式都是BIN文件,可以直接烧录进FLASH中,但是BIN文件中不含FLASH的地址,这就造成了烧写程序存在一定的不严谨性,可能烧写出错后,不知道在哪块...

    前言

    最近在研究STM32的IAP升级功能,发现大多数的IAP升级时的文件格式都是BIN文件,可以直接烧录进FLASH中,但是BIN文件中不含FLASH的地址,这就造成了烧写程序存在一定的不严谨性,可能烧写出错后,不知道在哪块烧写的地址出错,只能全部重新烧写,为此研究了一下IAP升级时使用hex格式文件,hex格式文件每行数据都包含烧写的地址信息,可确保出错后可以方便定位到哪一段地址烧写错误。

    hex文件的格式

    8debc8e91c835cbbaae9d1c7462feb8c.png

    hex文件部分

    hex格式文件每行都必须以‘:’开头,以‘’换行。

    如图,其中第一行:020000040800F2中,可以看做是0x02 0x00 0x00 0x04 0x08 0x00 0xf2,其前四个字节和最后一个字节有特殊含义。中间为数据

    第一个0x02表示该行数据中有两个数据

    第二个,第三个0x00 0x00表示本行数据的起始地址位,即起始地址为0x0000

    第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义:

    '00'Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

    '01'文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

    '02'扩展段地址记录:用来标识扩展段地址的记录

    '03'开始段地址记录:开始段地址记录

    '04'扩展线性地址记录:用来标识扩展线性地址的记录

    '05'开始线性地址记录:开始线性地址记录

    本行数据的第四个字节为04,即表示该行中的数据是记录扩展线性地址的,地址为0x0800,所以数据的起始地址为扩展线性地址+起始地址,即本例的起始地址为0x08000000

    最后一个字节0xf2为校验和。校验和= 0x100 - 累加和

    第二行数据:

    :10F80000D83D002025A7010879A401087BA40108A0

    该行数据0x10,表示该行有16个数据,F8 00 表示改行数据的起始地址为0xF800,00表示该行数据的类型是数据记录,D8 3D 00 20 25 A7 01 08 79 A4 01 08 7B A4 01 08表示记录的16个数据,A0为校验和。

    代码实现

    了解了hex文件的构成后,就需要用代码去解析该文件,在STM32中对接收到上层发下来的文件进行解析,具体代码实现过程如下:

    hex文件数据的类型定义

    23995b8720c4fdb864a5e8c3538558b6.png

    hex格式文件的类型定义

    hex文件解析数据结构

    ac2d8de9ddbc49988807e99148627f1e.png

    hex格式文件结构体

    hex文件数据行结构体,最大行需根据硬件的RAM缓存来设置,一般不超过30行。

    7316ba6b19238b27586769ae968cab57.png

    数据行结构体

    头文件定义好后,就可以着手编程了。

    具体的代码如下:

    fcbbd59fd6489db043ab36aad4db3c9f.png

    hex数据转字符串

    7379d155666e1007214492659d9fe95c.png

    hex文件解析代码1

    b2515351765d3825378e35f1b3f32b59.png

    hex文件解析代码2

    9e18b8a322a1e03533f40b05ded85b0f.png

    hex文件解析代码3

    60d6cda26e243d799e8dabd91a61dc19.png

    hex文件解析代码4

    ded01e27d5310fc5a5e21777e5228fa1.png

    hex文件解析代码5

    按此代码运行后就可以解析hex文件,实现IAP升级了。

    话说头条编辑代码真的low,不像CSDN一样好用,就这样吧,凑合着看下截图的代码吧,若有源码需求的可以私信我。

    展开全文
  • 00 关于HexHex文件格式(本文讲的是Intel Hex)是好多好多年以前定义的格式,解析这文件的工具网上搜出来的也是一大摞一大摞的。记住,我们就别瞎折腾自己写一个了哦。我们要学会站在巨人的肩膀上做开发,别干那些重复...
    00 关于Hex

    Hex文件格式(本文讲的是Intel Hex)是好多好多年以前定义的格式,解析这文件的工具网上搜出来的也是一大摞一大摞的。记住,我们就别瞎折腾自己写一个了哦。我们要学会站在巨人的肩膀上做开发,别干那些重复又累人的活儿。

    话说回来,常用的解析Hex文件的工具有:IntelHex(Python),bincopy(Python)以及SRecordizer(C++),当然还有其他的,如BIN2MOTbinex 等等。

    今天,我就教大家用IntelHex来玩转Hex文件,玩起来,Hex和Bin是没区别的!

    等等,如果你还不了解Hex文件格式,请戳《SREC、Hex、Bin等烧录文件格式完全解读》。

    01 写Hex文件

    如果你精通Hex文件格式,我也不介意你自己手动敲一个,但我教你个快捷的办法:

     from intelhex import IntelHexih = IntelHex() for i in range(256):     ih[i] = i ih.tofile("hex256.hex", format="hex") ih.tofile("hex256.bin", format="bin")

    生成出来的是长这样的:

     :10000000000102030405060708090A0B0C0D0E0F78 :10001000101112131415161718191A1B1C1D1E1F68 :10002000202122232425262728292A2B2C2D2E2F58 :10003000303132333435363738393A3B3C3D3E3F48 :10004000404142434445464748494A4B4C4D4E4F38 :10005000505152535455565758595A5B5C5D5E5F28 :10006000606162636465666768696A6B6C6D6E6F18 :10007000707172737475767778797A7B7C7D7E7F08 :10008000808182838485868788898A8B8C8D8E8FF8 :10009000909192939495969798999A9B9C9D9E9FE8 :1000A000A0A1A2A3A4A5A6A7A8A9AAABACADAEAFD8 :1000B000B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC8 :1000C000C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFB8 :1000D000D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFA8 :1000E000E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF98 :1000F000F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF88 :00000001FF

    而其bin形式内容是:

    34b168171996a9363045703ecd3c75fb.png

    另外,如果想将生产的hex文件当字符串使用,可以直接使用Python内置的StringIO,像这样:

     from io import StringIO from intelhex import IntelHex ih = IntelHex() ih[10] = 0x10 ih[11] = 0x11 ih[12] = 0x12 sio = StringIO() ih.write_hex_file(sio) hexstr = sio.getvalue() sio.close() print(hexstr)
     :03000A00101112C0:00000001FF

    这里面这个strhex就是这个Hex文件的字符串形式,可以直接在代码里面使用。

    02 读Hex文件

    你不要看小这个读功能哦,它不但可以将Hex文件读出来使用,而且还可以将Bin文件读出来当Hex来使用。

    1. load Hex文件
     ih = IntelHex()                     # create empty object ih.loadhex('hex256.hex')               # load from hex #ih.loadfile('hex256.hex',format='hex') # also load from hex #ih.fromfile('hex256.hex',format='hex') # also load from hex

    以上,这里有三种方法(loadhexloadfilefromfile)将Hex文件load进来,都是一样的结果。

    2. load Bin文件

    同样道理,我们来试试load Bin文件试试:

     ih = IntelHex()                     # create empty object ih.loadbin('hex256.bin')               # load from bin #ih.fromfile('hex256.bin',format='bin') # also load from bin

    以上办法,是将整个Bin文件load进去的,如果将这个Bin文件load到一个特定地址开始呢?

     ih1.loadbin('hex256.bin',offset=40) # load binary data and place them
    注意这个load进去的文件,是从offset地址开始填充Bin内容的,offset之前的内容是用默认值替代的。

    我们可以测试下:

     ih2 = IntelHex()                     # create empty object ih2.loadbin('hex256.bin',offset=40) print(ih2[38],ih2[39],ih2[40],ih2[41])
     255 255 0 1
    3. 直接通过类参数来load Hex文件
     ih = IntelHex('hex256.hex')

    这个多简单,但是注意,这种方法是load不了Bin文件的,当然,你可以用这种方法load一个初始化好的对象,如:

     ih = IntelHex(ih2)
    4. 获取文件的内容

    从上面的例子可以看到,我们可以直接从对象ih加个下标来取取内容。

    要注意下,这个ih[x]取出来的值是整型的,范围是0-255,而这个x就是Bin内容的地址。

    我们不止可以用ih[x]读数据,还能写数据,如ih[x] = y

    实际上,这个取值和赋值是Python类里面的两个不同方法:__getitem____setitem__,如果你有超大量的数据要读或者写,效率就不说话那么高了。当然,如果你只是操作1MB以内的内容,也无所谓了。后续我会解释有没有提高效率的方法。

    03 Hex转Bin

    这个是比较常用的,其实也很简单,直接用tobinfile就可以解决。

     ih = IntelHex('hex256.hex') ih.tobinfile('hex2bin.bin')
    我们还可以将Bin文件转换成Bin文件,呃呃……我是说提取你想要的片段
     ih2.tobinfile('hex2bin.bin', 35, 45)

    注意,这个35是提取的起始地址,45是结束地址。

    这个hex2bin.bin文件就是这样的:

     0000: FF FF FF FF FF 00 01 02 03 04 05

    其中里面的FF就是默认值,其实我们可以用padding改变它,如果需要的话:

     ih2.padding = 0x55 ih2.tobinfile('hex2bin.bin', 35, 45)

    这就变成了:

     0000: 55 55 55 55 55 00 01 02 03 04 05

    这里有个做好的hex2bin.py脚本,非常方便使用

     Usage:   python hex2bin.py [options] INFILE [OUTFILE]Arguments:   INFILE     name of hex file for processing.   OUTFILE     name of output file. If omitted then output               will be writing to stdout.Options:    -h, --help             this help message.    -p, --pad=FF           pad byte for empty spaces (hex value).    -r, --range=START:END   specify address range for writing output                           (hex value).                           Range can be in form 'START:' or ':END'.    -l, --length=NNNN,    -s, --size=NNNN         size of output (decimal value).

    例如可以这样的:

     python hex2bin.py -r 0000:00FF foo.hex
    04 Bin转Hex

    倒过来也行,首先将Bin load成一个IntelHex对象,然后调用ih.tofile(fout, format='hex')即可

     ih2 = IntelHex()                     ih2.loadbin('hex256.bin',offset=40) ih2.tofile('bin2hex.hex', format='hex')

    到这里,你会发现,这跟转Bin不是一样的吗,是的,一样。只要你有一个IntelHex对象,你就可以随意转Hex或者Bin了。

    这里有个做好的bin2hex.py脚本,非常方便使用

     Usage:   python bin2hex.py [options] INFILE [OUTFILE]Arguments:   INFILE     name of bin file for processing.               Use '-' for reading from stdin.   OUTFILE     name of output file. If omitted then output               will be writing to stdout.Options:    -h, --help             this help message.    --offset=N             offset for loading bin file (default: 0).
    05 将Bin或Hex内容打印出来

    有时候,你是不是想想看看Bin文件里面的内容而要去找能显示Bin内容的编辑器啊,例如WinHex或者Notepad++的Hex插件。或者你想看看Hex文件里面的实际内存,而找不到理想的工具啊。

    我这里有个简便的方法。

     ih2.dump()

    04c695af3da89aa8b8a2a644b90a043d.png

    呵呵,就这么简单粗暴。

    当然,这个dump是有参数的,你可以根据你的需要做不同处理

     def dump(self, tofile=None, width=16, withpadding=False):         """Dump object content to specified file object or to stdout if None.        Format is a hexdump with some header information at the beginning,        addresses on the left, and data on right.        @param tofile         file-like object to dump to        @param width           number of bytes per line (i.e. columns)        @param withpadding     print padding character instead of '--'        @raise ValueError     if width is not a positive integer        """

    这里有个做好的hex2dump.py脚本,非常方便使用

     Usage:   python hex2dump.py [options] HEXFILEOptions:    -h, --help             this help message.    -r, --range=START:END   specify address range for dumping                           (ascii hex value).                           Range can be in form 'START:' or ':END'.Arguments:   HEXFILE     name of hex file for processing (use '-' to read               from stdin)
    06 合并Hex

    如果有两个Hex,想将他们合并成一个,你会怎么做?

    IntelHex有现成的方法,也非常简便

     ih1 = IntelHex() ih2 = IntelHex() ih1[0] = 0 ih1[1] = 1 ih2[1] = 11 ih2[5] = 5 ih2[6] = 6 ih1.merge(ih2, overlap='ignore') ih1.dump()
     0000 00 01 -- -- -- 05 06 -- -- -- -- -- -- -- -- -- |..   ..         |

    以上merge函数的参数overlap要注意下,有三种选择:

    overlap='error', 表示如果ih1和ih2有重复的内容,运行这函数会产生Error;overlap='ignore',表示如果ih1和ih2有重复的内容,运行这函数会忽略ih2的这个重复值;overlap='replace',表示如果ih1和ih2有重复的内容,运行这函数会将ih2的重复值替换到ih1对应的位置。

    另外,这个merge是不限于两个Hex的哦,Hex和Bin合并也行。

    为了方便使用,这里有个现成的脚本hexmerge.py

     Usage:   python hexmerge.py [options] FILES...Options:    -h, --help             this help message.    -o, --output=FILENAME   output file name (emit output to stdout                            if option is not specified)    -r, --range=START:END   specify address range for output                           (ascii hex value).                           Range can be in form 'START:' or ':END'.    --no-start-addr         Don't write start addr to output file.    --overlap=METHOD       What to do when data in files overlapped.                           Supported variants:                           * error -- stop and show error message (default)                           * ignore -- keep data from first file that                                       contains data at overlapped address                           * replace -- use data from last file that                                         contains data at overlapped addressArguments:   FILES       list of hex files for merging               (use '-' to read content from stdin)You can specify address range for each file in the form:   filename:START:ENDSee description of range option above.You can omit START or END, so supported variants are:   filename:START:     read filename and use data starting from START addr   filename::END       read filename and use data till END addrUse entire file content:   filenameor   filename::
    07 比较Hex或者Bin

    对于比较Bin文件还好,找个BeyondCompare就非常直观地看到差异。如果要比较两个Hex呢,或者Hex和Bin比较呢?

     from intelhex import diff_dumps diff_dumps(ih1, ih2)
     --- a+++ b@@ -1 +1 @@-0000  00 01 -- -- -- 05 06 -- -- -- -- -- -- -- -- -- |..   ..         |+0000  -- 0B -- -- -- 05 06 -- -- -- -- -- -- -- -- -- | .   ..         |

    熟悉Linux上的diff命令就很容易理解了,不详细解释这个diff格式了,有感兴趣可以网上搜索diff查看,很详细很容易理解。

    为了方便使用,这里有个现成的脚本hexmerge.py

     hexdiff: diff dumps of 2 hex files.Usage:   python hexdiff.py [options] FILE1 FILE2Options:    -h, --help             this help message.    -v, --version           version info.
    08 Hex转C数组
     ih = IntelHex('hex256.hex') data_prefix = "const unsigned char hexdata[] = \n{" data_subfix = "\n};\n" print(data_prefix, end='') for i, data in enumerate(ih.tobinarray()):     if(i%16 == 0): print("\n   ", end='')     print("0x%02X, "%data, end='') print(data_subfix)
     const unsigned char hexdata[] = {     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,     0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,     0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,     0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,     0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,     0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, };
    09 计算Hex的Checksum或者CRC

    从以上的案例,我们可以学习到,可以通过对象加下标可以取值,那么我们也可以写个Checksum或CRC函数直接计算。

    但是,这并非很好的方法,因为对于大数据量的Hex文件,这效率很低的。如果文件不是特别大,电脑内存允许的情况下,可以直接转成Bin再算Checksum,这样效率会高很多。

    from intelhex import IntelHex import binascii ih = IntelHex('hex256.hex') val = binascii.crc32(ih.tobinarray()) print("CRC32 = 0x%08X"%val)
     CRC32 = 0x29058C73
    10 获取Hex文件信息

    Hex文件里会有很多空隙,会分成很多段,我们想查看或者获取这些信息,怎么做呢?

     ih = IntelHex() ih[1] = 1 ih[2] = 1 ih[3] = 1 ih[7] = 1 ih[8] = 1 ih[11] = 1 ih[12] = 1 print(ih.segments()) ih.tofile("hexsegments.hex", format='hex')
     [(1, 4), (7, 9), (11, 13)]

    实际上这个segments获取的是从哪个地址到哪个地址是有内容的。

    这里还有个更方便的方法,hexinfo.py

     hexinfo: summarize a hex file's contents.Usage:   python hexinfo.py [options] FILE [ FILE ... ]Options:    -h, --help             this help message.    -v, --version           version info.

    例如

     python hexinfo.py hexsegments.hex

    得到的信息是:

     - file: './hexsegments.hex' data:  - { first: 0x00000001, last: 0x00000003, length: 0x00000003 }  - { first: 0x00000007, last: 0x00000008, length: 0x00000002 }  - { first: 0x0000000B, last: 0x0000000C, length: 0x00000002 }

    注:上文提到的脚本:

    bin2hex.py

    hex2bin.py

    hex2dump.py

    hexdiff.py

    hexinfo.py

    hexmerge.py

    请见:

    https://github.com/python-intelhex/intelhex

    如果无法访问,在公众号对话框回复Hex获取下载链接。

    下期预告:玩转S19文件>>>猜猜你喜欢“嵌入式开发学脚本干嘛”之进制/Byte/Hex处理关于CRC8/CRC16/CRC32,你要找的全部在这SREC、Hex、Bin等烧录文件格式完全解读我硬生生地把C代码塞进了Python和Rubyd8d3b48dfa1024c2c9ca9ec1f6d4bf81.png
    展开全文
  • STM32 HEX 文件格式解析

    2020-06-02 15:57:23
    这种文件格式主要用于保存单片机固件。 hex文件内容: 整个文件以行为单位,每行以冒号开头,内容全部为16进制码,2个 ASCII码字符表示1个Hex字节。 :02 0000 04 0800 F2 1、每行以冒号开头 2、第1字节0x...
  • HEX文件格式解析(转)

    千次阅读 2019-08-31 16:40:17
    Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组...
  • class字节码文件解析1.1. 背景最近由于工作的需要,对Class文件做了一定的了解。然而枯燥无味的课程总是让人犯困,在学习的过程中,总有一种虚无缥缈的感受,看起来好像已经会了。但又好像什么也没懂。故想到不如...
  • [转]HEX文件格式解析

    2017-08-01 11:53:00
    1.前言 本文主要讲述keil MDK 下STM32编译生成的的HEX镜像文件格式。并说明镜像load地址是如何添加进HEX文件的。 2.keil MDK如何在HEX文件中添加load addr ...3.HEX文件格式 冒号 本行数据长度 本行数据...
  • 关于烧录文件在典型的应用程序中,编译器或汇编器将程序的源代码(例如C或汇编语言)转换为机器代码,并将其输出到一个文件中。然后,这个文件由程序员导入,以将机器代码“烧录”到ROM(或Flash Memory)中,或传输到...
  • Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,真个文件以行为单位,每行以冒号开头,内容全部为16进制码。Hex文件可以按照如下的方式进行拆分来分析其中的内容:例如::020000040000FA , 我...
  • 转载_Hex文件格式解析

    2013-02-19 10:32:12
    Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。  Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。...
  • HEX文件格式详细解析

    2012-11-19 14:25:20
    最完整的HEX文件格式详细解析,用它分析地址数据等。很详细的说明。
  • HEX文件格式文档(用于解析HEX文件)
  • hex文件格式

    2019-09-26 23:58:13
    Hex文件格式解析 Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。Hex文件可以按照如下的方式进行拆分来...
  • HEX文件格式

    2018-09-11 18:21:03
    Hex文件格式解析 Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。Hex文件可以按照如下的方式进行拆分来...
  • HEX文件格式,ihex,hex解析

    万次阅读 2009-12-29 16:05:00
    来自:http://blog.csdn.net/GZFStudy/archive/2008/09/03/2873814.aspxIntel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器
  • hex文件解析- keil

    2020-06-30 22:38:39
    在你做升级的时候你会用到hex文件的加载,所以对hex文件解析很重要。 1,结构 .hex整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示) 格式为: <0x3a > 数据长度 1byte 数据...
  • 其实将Hex文件拼在一起即可融合http://www.keil.com/support/docs/1584.htm

空空如也

空空如也

1 2 3 4 5 6
收藏数 113
精华内容 45
关键字:

hex文件格式解析