c语言解析hex文件格式,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
{
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语言解析hex文件格式,HEX文件格式,ihex,hex解析相关推荐
- 【转】hex和bin文件格式的区别
hex和bin文件格式的区别 Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量.Intel HEX文件经 ...
- hex文件格式剖析,以及hex与bin文件互相转换
大家好,我是学电子的小白白. 熟悉单片机开发的朋友,应该经常见到*.hex后缀的文件,它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件),通过烧写工具把它下载 ...
- hex和bin文件格式区别
1.hex介绍 Hex 全称 (Intel HEX)文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件.在Intel HEX文件中,每一行包含一个HEX记录.这些记录由对应机 ...
- hex和bin文件格式
Hex文件,这里指的是Intel标准的十六进制文件,也就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示.具体格式介绍如下: Intel hex 文件格式 Intel hex 文件常 ...
- 有关IAP使用HEX或BIN文件格式的探讨
有关IAP使用HEX或BIN文件格式的探讨 BIN优点,下载时二进制传输效率高,一个起始地址和长度(均可事先知道)搞定.因起始地址和长度在 下载一开始就可以知道,所以只需要擦除实际代码大小的FLASH ...
- bin、hex、elf、axf文件解析
冰冻三尺非一日之寒,滴水穿石非一日之功 文章目录 引言 文件分类 1.bin文件 2.hex文件 3.axf文件 4.elf文件 总结 参考资料:深度理解编译过程 参考资料:深度理解编译文件 引言 b ...
- 将两个HEX文件合并成一个HEX文件
将两个HEX文件合并成一个HEX文件 文章目录 将两个HEX文件合并成一个HEX文件 系统环境 1. 生成BootLoader和app的HEX文件 2. 将两个HEX文件合并成一个HEX 3. 利用J ...
- C语言计算日期间隔天数的经典算法解析
C语言计算日期间隔天数的经典算法解析 网上看到一个计算日期间隔的方法,很高深,很巧妙.代码如下: #include <stdio.h> #include <stdlib.h> ...
- android打开hex文件怎么打开,hex文件扩展名,hex文件怎么打开?
.hex 文件类型1:BinHex Encoded File 文件说明:File encoded with an early version of BinHex (binary-to-hexadeci ...
- 2023-03-18青少年软件编程(C语言)等级考试试卷(一级)解析
2023-03-18青少年软件编程(C语言)等级考试试卷(一级)解析 T1.字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出. 时间限制:1000 内存限制: ...
最新文章
- 截断坐标轴参数的应用小例子
- 研究人员利用非线性原理为机器人创造出类似昆虫的步态,脑机接口也可以使用...
- android handler 主线程吗,[android开发]非主线程进行handler操作
- SQL基础使用入门(二): DML语句和DCL语句
- SpringBoot AOP完全讲解二:统一处理请求日志
- VTK:可视化算法之FlyingHeadSlice
- OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例(附完整代码)
- Flink SQL Client中的session window图解
- 带旋treap概念及模板,带例题:普通平衡树
- Repeater的嵌套
- 赞,全网开发者都在学的 26 门 AI 课程!
- TDEngine游戏平台框架逻辑
- Day15Day16多任务和任务切换
- Windows上提升舒适度的好物分享(没恰饭)
- imindmap思维导图免费下载
- 游戏公司游戏策划面试笔记
- Android Studio第11课网络编程3(学习打卡Day17)
- 在小鸟云进行服务器托管,怎么升级配置?
- 很酷的瞄准镜样式光标效果
- 国内电商系统为什么要以ThinkPHP为核心开发