转载 : HEX文件格式,ihex,hex解析(这个应该是准确的描述)


转载自:http://blog.csdn.net/GZFStudy/archive/2008/09/03/2873814.aspx


Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多数 EPROM 编 程器或模 拟器使用Intel HEX 文件。
记录 格式
Intel HEX 由任意数量的十六 进 制 记录组 成。每 个记录 包含5 个 域, 它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母 对应 一 个 不同的域,每一 个 字母 对应 一 个 十六 进 制 编码 的 数 字。每一 个 域由至少 两个 十六 进 制 编码数 字 组 成, 它们构 成一个 字 节 ,就像以下描述的那 样:


每个Intel HEX 记录 都由冒 号开头 .
ll 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 .
aaaa 是地址域, 它代表 记录当 中 数据的起始地址 . 
tt 是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:
    00 – 数 据 记录
    01 – 文件结 束 记录
    02 – 扩展段地址 记录
    04 – 扩展 线 性地址 记录
dd 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和 数 据 长 度域(ll) 中指定的 数字相符.
cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值 相加, 以256 为 模 进 行以下 补足.

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


数 据 记录
Intel HEX文件由任意数 量以回 车换 行符 结 束的 数 据 记录组 成. 数 据 记录 外 观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中 数 据字 节 的 数量.即0x10 
2462 是数据 将 被下 载 到存 储 器 当中的地址.即0x2462 
00 是记录类型( 数 据 记录).即0x00 
464C…464C是 数据.分别代表0x46,0x4C... 
33 是这个记录的校 验和.即0x33


扩展 线 性地址 记录(HEX386)
扩 展 线 性地址 记录 也叫作32 位地址 记录 或HEX386 记录 . 这 些 记录 包含 数 据地址的高16 位. 扩 展 线 性地址 记录总 是有 两个数 据字 节 , 外 观如下:
:02000004FFFFFC
其中:
02 是这个记录当中 数 据字 节 的 数量.
0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
04 是记录类型 04( 扩 展 线 性地址 记录)
FFFF 是地址的高16 位.
FC 是这个记录的校 验 和, 计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当一 个扩 展 线 性地址 记录 被 读 取, 存 储 于 数 据域的 扩 展 线 性地址被保存, 它 被 应 用于 从 Intel HEX 文件 读 取 来 的 随 后的 记录 . 线 性地址保持有效, 直到 它 被另外一 个扩 展地址 记录 所改 变.
通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展 线 性地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址.
以下的例子演示了这个过 程..
来自 数 据 记录地址域的地址                       2462
扩展 线 性地址 记录 的 数据域                      + FFFF
                                  ------------
绝对存 储 器地址                               FFFF2462

扩 展段地址 记录(HEX86)
扩 展段地址 记录 也叫HEX86 记录 , 它 包括4-19 位 数 据地址段. 扩 展段地址 记录总 是有 两个数 据字 节 , 外 观如下:
:020000021200EA
其中:
02 是记录当中 数 据字 节 的 数量.
0000 是地址域. 对于 扩 展段地址 记录 , 这个 域 总是0000.
02 是记录类型 02( 扩 展段地址 记录)
1200 是地址段.
EA 是这个记录的校 验 和, 计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当一 个扩 展段地址 记录 被 读 取, 存 储 于 数 据域的 扩 展段地址被保存, 它 被 应 用于 从 Intel HEX 文件 读 取 来 的 随 后的 记录 . 段地址保持有效,直到 它 被另外一 个扩 展地址 记录 所改 变.
通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展段地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址.
以下的例子演示了这个过 程..
来自 数 据 记录地址域的地址                             2462
扩展段地址 记录数据域                      +  1200
                                 ---------
绝对存 储 器地址                    00014462

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


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. }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值