hex格式介绍及转bin格式的源程序
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)。行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0x01;”0a”,就表示0x0a。对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。下面为HEX文件中的一行:
:10000000FF0462FF051EFF0A93FF0572FF0A93FFBC
“:”表示一行的开始。
“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。
第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
第7,8个字符“00”表示数据的类型。该类型总共有以下几种:
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为:
:00000001FF
以上的信息其实就足够进行HEX转BIN格式的程序的编写。首先我们只处理数据类型为0x00及0x01的情况。0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。
我的编程思路是从文件中一个一个读出字符,根据“:”判断一行的开始,然后每两个字符转换成一个字节,并解释其对应的意义。然后将数据从该行中剥离出来保存到缓冲区中,并最终输出到文件中。
具体程序如下,该程序在VC2005下采用控制台项目编译,需要在release下编译,在debug模式中会提示一个dll文件无法找到,这可能是VC自身的错误。
// hextobin.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <malloc.h>
#include <memory.h>
typedef unsigned char BYTE;
//将两个字符转化为一个字节量
void CharToByte(char* pChar,BYTE* pByte)
{
char h,l;
h=pChar[]; //高位
l=pChar[]; //低位
')
l=l-';
else if(l>='a' && l<='f')
l=l-'a'+0xa;
else if(l>='A' && l<='F')
l=l-'A'+0xa;
')
h=h-';
else if(h>='a' && h<='f')
h=h-'a'+0xa;
else if(h>='A' &&h <='F')
h=h-'A'+0xa;
*pByte=(BYTE)h*+l;
}
int _tmain(int argc, _TCHAR* argv[])
{
];
];
BYTE *outBuf;
FILE *myFile;
int len;
int i;
BYTE adressHigh;
BYTE adressLow;
BYTE dataLen;
BYTE dataType;
BYTE byteData;
int totalLen;
totalLen = ;
len = ;
adressHigh = ;
adressLow = ;
dataLen = ;
dataType = ;
printf("请输入HEX格式文件名:");
scanf_s("%s",fileName);
printf("\n");
)
{
printf("打开文件%s失败!",fileName);
}
//将文件长度计算出来用于申请存储数据的缓冲区
while (!feof(myFile))
{
++len;
fgetc(myFile);
}
rewind(myFile);
//因为是每两个字符表示一个字节,所以最大的数据个数要少于文件字符个数的一半
outBuf = (BYTE*)malloc(len/);
memset(outBuf,);
while (!feof(myFile))
{
//:号表示一行的开始
if (fgetc(myFile) == ':')
{
//一行的头两个字符表示该行包含的数据长度
data[] = fgetc(myFile);
data[] = fgetc(myFile);
CharToByte(data,&dataLen);
//一行的第、个字符表示数据存储起始地址的高位
data[] = fgetc(myFile);
data[] = fgetc(myFile);
CharToByte(data,&adressHigh);
//一行的第、个字符表示数据存储起始地址的低位
data[] = fgetc(myFile);
data[] = fgetc(myFile);
CharToByte(data,&adressLow);
//一行的第、个字符表示数据类型
data[] = fgetc(myFile);
data[] = fgetc(myFile);
CharToByte(data,&dataType);
//当数据类型为时,表示本行包含的是普通数据记录
if (dataType == 0x00)
{
;i<dataLen;i++)
{
data[] = fgetc(myFile);
data[] = fgetc(myFile);
CharToByte(data,&byteData);
outBuf[adressHigh*+adressLow+i] = byteData;
}
totalLen += dataLen;
}
//当数据类型为时,表示到了最后一行
if (dataType == 0x01)
{
printf("文件结束记录!");
}
//当数据类型为时,表示本行包含的是扩展段地址记录
if (dataType == 0x02)
{
printf("不支持扩展段地址记录!");
;
}
//当数据类型为时,表示本行包含的是扩展线性地址记录
if (dataType == 0x04)
{
printf("不支持扩展线性地址记录!");
;
}
}
}
fclose(myFile);
printf("请输入保存的BIN格式文件名:");
scanf_s("%s",fileName);
)
{
printf("打开文件%s失败!",fileName);
}
;i<totalLen;i++)
{
fputc(outBuf[i],myFile);
}
;
}
hex格式介绍及转bin格式的源程序的更多相关文章
- keil MDK中如何生成*.bin格式的文件
在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...
- 在MDK中怎样生成*.bin格式的文件?
在Realview MDK的集成开发环境中.默认情况下能够生成*.axf格式的调试文件和*.hex格式的可运行文件. 尽管这两个格式的文件很有利于ULINK2仿真器的下载和调试,可是ADS的用户更习惯 ...
- 图像bayer格式介绍以及bayer插值原理CFA
1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像. 对于彩色图像,需要采集多种最基本的颜色, ...
- 图像bayer格式介绍【转】
本文转载自:http://www.cnblogs.com/whw19818/p/6223143.html 1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发 ...
- 图像JPEG格式介绍
1 JPG格式介绍 JPEG (Joint PhotographicExperts GROUP)是由国际标准组织和国际电话电报咨询委员会为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用 ...
- Mysql Binlog 三种格式介绍及分析
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- web字体格式及几种在线格式转换工具介绍
原文地址:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字 ...
- 深蓝词库转换2.4版发布,支持最新的搜狗用户词库备份bin格式
很高兴的告诉大家,感谢GitHub上的h4x3rotab提供python版的搜狗用户词库备份bin格式的解析算法,感谢tmxkn1提供了C#版的实现,深蓝词库转换终于迎来了一个重大更新,能够支持搜狗用 ...
- 图像YUV格式介绍
图像YUV格式介绍 1 YUV格式简介 YUV格式,与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 ...
随机推荐
- Qt Lite
http://blog.qt.io/blog/2016/08/18/introducing-the-qt-lite-project-qt-for-any-platform-any-thing-any- ...
- VMware Workstation 精致汉化系列 使用方法
http://kuai.xunlei.com/d/QqGABAKChQBwMzxR983 迅雷快传 XP系统之家-温馨提示: VMware Workstation 精致汉化系列 使用方法:1.安装 ...
- c语言结构体2之变量赋值于字符串
#include <stdio.h> #include <stdlib.h> struct dangdang { ]; ]; ]; int num; int bugnum; ] ...
- HDU 2845 Beans (DP)
Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled ...
- openstack中glance组件images的全部python API 汇总
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- c++11 : range-based for loop
0. 形式 for ( declaration : expression ) statement 0.1 根据标准将会扩展成这样的形式: 1 { 2 auto&& __ra ...
- Win7访问局域网内共享文件夹
\\192.168.1.102\\IP地址
- HTML与CSS入门——第八章 使用外部和内部链接
知识点: 1.链接锚的使用方法 2.在自己的网站上的页面之间链接的方法 3.链接到外部内容的方法 4.链接到一个E-mail地址的方法 5.在新浏览器窗口中查看链接的方法 6.用CSS为链接添加样式的 ...
- OWIN初探(转)
什么是 OWIN ? OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一 ...
- SqlDbType与DbType这间的转换关系
SqlDbType => DbType SqlDbType.BigInt DbType.Int64 SqlDbType.Binary DbType.Binary SqlDbType.Bit Db ...