• [转]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语言,这才是精华-------------------

    [cpp] view plain copy
     
      1. int ParseIHexPerLine(const char *buf,const char *path,int line)  
      2. {  
      3.     unsigned int nbytes=0,addr=0,type=0,i,val,line_chksum;  
      4.     unsigned char data[1024];     
      5.     unsigned char cksum;  
      6.     const char *s=buf;            
      7.     if(*s!=':') //第一个为冒号  
      8.     {    
      9.         fprintf(stderr,"%s:%s: format violation (1)/n",path,line);  
      10.         return(1);    
      11.     }  
      12.     ++s;  
      13.     //接下来的8个字节为数据大小、地址等  
      14.     if(sscanf(s,"%02x%04x%02x",&nbytes,&addr,&type)!=3)  
      15.     {    
      16.         fprintf(stderr,"%s:%s: format violation (2)/n",path,line);  
      17.         return(1);    
      18.     }  
      19.     s+=8;  
      20.     //读到的类型  
      21.     if(type==0) //为数据段  
      22.     {  
      23.         if(!(nbytes>=0 && nbytes<1024))  
      24.         {  
      25.             perror("nbyte per line unsupport/n");  
      26.             return(-1);  
      27.         }  
      28.           
      29.         cksum=nbytes+addr+(addr>>8)+type;  
      30.         //  
      31.         for(i=0; i<nbytes; i++)  
      32.         {  
      33.             val=0;  
      34.             if(sscanf(s,"%02x",&val)!=1)  
      35.             {    
      36.                 fprintf(stderr,"%s:%s: format violation (3)/n",path,line);  
      37.                 return(1);  
      38.             }  
      39.             s+=2;  
      40.             data[i]=val;  
      41.             cksum+=val;  
      42.         }  
      43.         //  
      44.         line_chksum=0;  
      45.         if(sscanf(s,"%02x",&line_chksum)!=1)  
      46.         {    
      47.             fprintf(stderr,"%s:%s: format violation (4)/n",path,line);  
      48.             return(1);    
      49.         }  
      50.         if((cksum+line_chksum)&0xff)  
      51.         {    
      52.             fprintf(stderr,"%s:%s: checksum mismatch (%u/%u)/n",  
      53.                     cksum,line_chksum);    
      54.             return(1);    
      55.         }  
      56.         if(WriteRAM(addr,data,nbytes))   
      57.             return(1);    
      58.     }  
      59.     else if(type==1)  
      60.     {  
      61.         // EOF marker. Oh well, trust it.   
      62.         return(-1);  
      63.     }  
      64.     else  
      65.     {  
      66.         fprintf(stderr,"%s:%s: Unknown entry type %d/n",type);  
      67.         return(1);  
      68.     }  
      69.     return(0);  
      70. }  
  • 相关阅读:
    CTF MISC-USB流量分析出题记录
    python-flask-ssti(模版注入漏洞)
    如何写一个Xss Bot
    nginx解析漏洞,配置不当,目录遍历漏洞环境搭建、漏洞复现
    weblogic在linux和window下的安装
    apache-日志-记录post数据
    条件竞争漏洞
    arpspoof+driftnet+ ARP欺骗简单图片抓取
    图片隐写--XOR&OR&and
    qcow2虚拟磁盘映像转化为vmdk
  • 原文地址:https://www.cnblogs.com/tubujia/p/8000797.html
Copyright © 2020-2023  润新知