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

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); }


你可能感兴趣的:(c,存储,扩展,语言,Path,hex)