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信息一样 ...
随机推荐
-
Excel—分离中英文字符
1.如下图: 2.提取中文字符为: 3.提取应为字符为: 4.说明: 该方法的原理利用了LENB和LEN计算方法的不同,LEN计算字符数,中英文都算作一个字符:LENB计算字节数,中文算两个字节,英文 ...
-
[goa]golang微服务框架学习(三)-- 使用swagger-ui展示API
既然goa框架自动生成啦swagger-json文件,那么如何用swagger-ui展示出来呢? 这里分三步: 1.下载swagger-ui的web代码 2.添加swagger.json 和 swag ...
-
Vue学习笔记-2
前言 本文非vue教程,仅为学习vue过程中的个人理解与笔记,有说的不正确的地方欢迎指正讨论 1.computed计算属性函数中不能使用vm变量 在计算属性的函数中,不能使用Vue构造函数返回的vm变 ...
-
JavaScript- 省市联动代码
以下是JS省市联动菜单代码: 代码一: <html> <head> <title></title> <script language=" ...
-
hadoop集群中删除原有jdk设置
普通用户: sudo rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64 tzdata-java-2012j-1.e ...
-
JSP/Servlet Web 学习笔记 DayTwo
JSP指令 a)page指令 定义JSP文件中的全局属性.一个JSP页面可以包含多个page指令.除了Import以外,其他page指令定义的属性/值只能出现一次. 其详细语法为: <%page ...
-
animate动画效果
$(selector).animate({params},speed,callback); 转载:https://www.runoob.com/jquery/jquery-animate.html j ...
-
Python 5 -- 模块
模块 - 模块就是包含函数的文件,用于共享代码. 导入已有模块 # 导入整个模块 import random # 导入整个模块 print(random.randint(0,255)) #调用模块中的 ...
-
css实现椭圆
先实现个简单点的,用css实现一个圆,ok,直接上代码: .circle{ width: 100px; height:100px; background: red; border-radius: 50 ...
-
20155211 2016-2017-2 《Java程序设计》第四周学习总结
20155211 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 这周的内容感觉较上周相比难度增加 教材学习中的问题和解决过程 刚开始学习第六章的时候的时候敲 ...