HEX文件格式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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); }
wenku.baidu.com
性地址保持有效, 直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过 程. 来自数据记录地址域的地址 扩展线性地址记录的数据域 -----------绝对存储器地址 扩展段地址记录(HEX86) 扩展段地址记录也叫 HEX86 记录,它包括 4-19 位数据地址段. 扩展段地址记录总是有两个数据字节,外观如下: :020000021200EA 其中: 02 是记录当中数据字节的数量. 0000 是地址域. 对于扩展段地址记录 , 这个域总是 0000. 02 是记录类型 02( 扩展段地址记录) 1200 是地址段. EA 是这个记录的校验和, 计算方法如下: 01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). 当一个扩展段地址记录被读取, 存储于数据域的扩展段地址被保存, 它被应用于从 Intel HEX 文件读取来的随后的记录 . 段地址 保持有效, 直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过程.. 来自数据记录地址域的地址 扩展段地址记录数据域 --------绝对存储器地址 文件结束(EOF)记录 Intel HEX 文件必须以文件结束(EOF)记录结束. 这个记录的记录类型域的值必须是 01.EOF 记录外观总是如下: :00000001FF 其中: 00 是记录当中数据字节的数量. 0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义被忽略的.0000h 是典型的地址. 01 是记录类型 01(文件结束记录) FF 是这个记录的校验和,计算方法如下: 01h + NOT(00h + 00h + 00h + 01h). 00014462 + 1200 2462 FFFF2462 2462 + FFFF
// 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); }
HEX 文件格式解析 2009-12-29 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 文件读取来的随后的记录 . 线
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; }