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格式的源程序的更多相关文章

  1. keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...

  2. 在MDK中怎样生成*.bin格式的文件?

    在Realview MDK的集成开发环境中.默认情况下能够生成*.axf格式的调试文件和*.hex格式的可运行文件. 尽管这两个格式的文件很有利于ULINK2仿真器的下载和调试,可是ADS的用户更习惯 ...

  3. 图像bayer格式介绍以及bayer插值原理CFA

    1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像. 对于彩色图像,需要采集多种最基本的颜色, ...

  4. 图像bayer格式介绍【转】

    本文转载自:http://www.cnblogs.com/whw19818/p/6223143.html 1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发 ...

  5. 图像JPEG格式介绍

    1 JPG格式介绍 JPEG (Joint PhotographicExperts GROUP)是由国际标准组织和国际电话电报咨询委员会为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用 ...

  6. Mysql Binlog 三种格式介绍及分析

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  7. web字体格式及几种在线格式转换工具介绍

    原文地址:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字 ...

  8. 深蓝词库转换2.4版发布,支持最新的搜狗用户词库备份bin格式

    很高兴的告诉大家,感谢GitHub上的h4x3rotab提供python版的搜狗用户词库备份bin格式的解析算法,感谢tmxkn1提供了C#版的实现,深蓝词库转换终于迎来了一个重大更新,能够支持搜狗用 ...

  9. 图像YUV格式介绍

    图像YUV格式介绍   1 YUV格式简介 YUV格式,与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 ...

随机推荐

  1. 关于Python的3张图

  2. WCF的执行过程

    既然是实现互通信.那么肯定会有概念意义上的服务端Server  和概念意义上的客户端 Client,在这里,我所说明的都是概念意义上的,单独强调此,是因为,基于WCF的通信没有物理上的划分,但是概念上 ...

  3. Qt error:QtThese QT version are inaccessible

    安装完Qt Add-in 打开VS2013的时候出现标题错误. QTDIR 需要设置成Qt安装目录下的vc,这个vc目录下包含include,lib,bin等文件夹.或者是在Qt Option里面设置 ...

  4. 关于ActionBar的向下兼容

    1. Create a blank Android Project创建一个空的Android项目.a. 导入ActionBarCompat工程.ActionBarCompat的source code位 ...

  5. ACM2036_改革春风吹满地(多边形面积计算公式)

    用到的知识点: 代码如下: /* Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆 ...

  6. 关于bootstrap--表单控件(disabled表单禁用、显示表单验证的样式)

    1.disabled: (1)在input中加入disabled可使表单禁用,如图: <input class="form-control input-lg" id=&quo ...

  7. python网络请求简洁之道--python requests简介

    #requests中文文档:http://cn.python-requests.org/en/latest/#学习出处:http://mp.weixin.qq.com/s?__biz=MjM5NzU0 ...

  8. 贪心-hdu-1789-Doing Homework again

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1789 题目意思: 有n个作业,每个作业有一个截止日期,每个作业如果超过截止日期完成的时候有一个惩罚值 ...

  9. Android企业级程序完全退出的解决方案

    一.问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一般要么是一个简单的finish(只是退出当前的activity),要么是其他的方法,比如: 1.第一种方法:首先 ...

  10. 再说重写IHttpHandler,实现前后端分离

    aspx页面第一次加载时,HttpHandler 里面是如何编译指定页面的呢?Framework提供了编译页面的API如下: BuildManager.CreateInstanceFromVirtua ...