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. JPA中以HibernatePersistence为provider的批量插入问题

    为什么要批量插入 要插入10000条数据,如果不批量插入的话,那么我们执行的sql语句将是10000条insert insert into member (group_id, user_id, rol ...

  2. java开源资源

    开到一遍不错的java开源整理,摘录一下,后续遇到好的继续更新. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置 ...

  3. HDU--3487 Play with Chain (Splay伸展树)

    Play with Chain Problem Description YaoYao is fond of playing his chains. He has a chain containing ...

  4. Linux 内存管理知识学习总结

    现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的.对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  5. IOS深入学习(12)之Archiving

    1 前言 本文介绍的是一个归档解档方法,也是编码和解码时候所做的事情,和如何进行,编码和归档其实就是将对象关系转化为字节流并且归档为特殊的文件,解码和解档是逆过程. 英文原文:http://blog. ...

  6. 70个经典的 Shell 脚本面试问题

    转载自:http://www.imooc.com/article/1131 1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1. ...

  7. Fiddler 抓取eclipse中的请求

    Fiddler 抓取eclipse中的请求 代码中添加 System.setProperty("http.proxySet", "true"); System. ...

  8. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  9. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(2)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选的第二部分,其余章节将陆续放出.上一 ...

  10. 曾经的足迹——对Linux CAN驱动的理解(1)

    在Ti的AM335X系列Cortext-A8芯片中,CAN模块采用D_CAN结构,实质即两路CAN接口. 在此分享一下对基于AM335X的Linux CAN驱动源码的理解.下面来分析它的驱动源码及其工 ...