以前写的一个Atmel的S5X的下载程序,其中有支持HEX格式的文件,所以将这个程序贴出来,程序的意思是将输入的HEX文件转换为BIN格式的文件,并存储到文件中,注意不支持64K的扩展模式。

int CFlashP51App::HexToBin(CString hexfile, CString binfile)
{
    CFile fhex, fbin;
    CString pBuffer;
    BYTE len, len1, len2, len_at_max=;
    ;
    ;

    if(!(fhex.Open(hexfile, CFile::modeRead, NULL)))  //// 打开文件
        ;
    if(!(fbin.Open(binfile, CFile::modeCreate|CFile::modeWrite, NULL)))
        ;

    char *buffer = new char [fhex.GetLength()];  //// 分配内存
    fhex.Read(buffer, fhex.GetLength());
    pBuffer = buffer;

    nEnd = pBuffer.Find(":00000001");     //// 以此来判断文件格式是否为HEX
    )    //先判断文件结尾处
    {
     //        AfxMessageBox("*.Hex文件转换失败(未找到\":00000001\"记录)!");
        ;
    }
    n = ;
    while(n < nEnd)        // 首先得到bin文件的长度
    {
        if(buffer[n] == ':')
        {
            CharToByte(&buffer[n+], &len);
            CharToByte(&buffer[n+], &len1);
            CharToByte(&buffer[n+], &len2);
            start_addr = (len1<<) + len2;    // 起始地址
            /*
             *    有的HEX文件中间会有"空洞",只靠计算前面每一行数据的大小
             *  可能会出现错误,因此得到最大的地址值和最大地址值这一行的
             *  数据大小来得到BIN文件的大小,实际上准确上因该采用此法,前
             *  面的方法没有去掉,可以去掉
             *
             */
            if(start_addr >= start_addr_max)
            {
                start_addr_max = start_addr;
                len_at_max = len;
            }
            bin_length += len;
            n += len*+;    // 没有加上回车符号
        }
        else
            n++;
    }
    start_addr_max += len_at_max;
    if(start_addr_max >= bin_length)
        bin_length = start_addr_max;

    BYTE *bbuf = new BYTE [bin_length];  //// 分配内存
    ; i<bin_length; i++)
        bbuf[i] = 0xff;
    n = ;
    while(n < nEnd)        // 向BIN文件缓冲区写数据
    {
        if(buffer[n] == ':')
        {
            CharToByte(&buffer[n+], &len);
            CharToByte(&buffer[n+], &len1);
            CharToByte(&buffer[n+], &len2);
            start_addr = (len1<<) + len2;    // 起始地址
            ; i<len; i++)
            {
                CharToByte(&buffer[n++i*], &len1);
                bbuf[start_addr+i] = len1;
            }
            n += len*+;    // 没有加上回车符号
        }
        else
            n++;
    }
    fbin.Write(bbuf, bin_length);

    fhex.Close();
    fbin.Close();
    delete [] buffer;
    delete [] bbuf;
    return bin_length;
}

BOOL CFlashP51App::CharToByte(char *pChar, BYTE *pByte)
{
    char h,l;
    h = pChar[]; //高4位
    l = pChar[]; //低4位
    ')
        l = l - ';
    else if(l>='a' && l<='f')
        l = l - 'a' + 0xa;
    else if(l>='A' && l<='F')
        l = l - 'A' + 0xa;
    else
        return FALSE;

    ')
        h = h - ';
    else if(h>='a' && h<='f')
        h = h - 'a' + 0xa;
    else if(h>='A' &&h <='F')
        h = h - 'A' + 0xa;
    else
        return FALSE;
    *pByte = (BYTE)h* + l;
    return TRUE;
}

HEX转BIN源码分析(51系列)的更多相关文章

  1. Kafka源码分析系列-目录(收藏不迷路)

    持续更新中,敬请关注! 目录 <Kafka源码分析>系列文章计划按"数据传递"的顺序写作,即:先分析生产者,其次分析Server端的数据处理,然后分析消费者,最后再补充 ...

  2. Docker源码分析(八):Docker Container网络(下)

    1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场 ...

  3. 【OpenCV】SIFT原理与源码分析:方向赋值

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<关键点搜索与定位>,我们已经找到 ...

  4. 【OpenCV】SIFT原理与源码分析:关键点搜索与定位

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一步<DoG尺度空间构造>,我们得到了 ...

  5. Shiro 源码分析

    http://my.oschina.net/huangyong/blog/215153 Shiro 是一个非常优秀的开源项目,源码非常值得学习与研究. 我想尝试做一次 不一样 的源码分析:源码分析不再 ...

  6. UiAutomator源码分析之获取控件信息

    根据上一篇文章<UiAutomator源码分析之注入事件>开始时提到的计划,这一篇文章我们要分析的是第二点: 如何获取控件信息 我们在测试脚本中初始化一个UiObject的时候通常是像以下 ...

  7. Appium Android Bootstrap源码分析之控件AndroidElement

    通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...

  8. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...

  9. MyBatis源码分析之环境准备篇

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

随机推荐

  1. SmartBusinessDevFramework架构设计-2:结构图示

    架构设计一览图 下图表示了本架构的设计草稿. 接下来  ,我们将逐步细述,各个模块之间的松散耦合关系. 核心的实现原理.敬请关注.

  2. ANDROID (eclipse)开发常见问题及解决办法汇总

    1.ANDROID 在eclipse中没有出现AVD的解决方法(转)如果android安装正确的话,但是eclipse里面的导航条就是没有AVD 可以通过「Window」⇒「Customize Per ...

  3. js实现编码,解码

    <p><script type="text/javascript">// <![CDATA[var decToHex = function(str) ...

  4. hdu2089:不要62(基础数位dp)

    题意:规定一个合法的号码不能含有4或者是连续的62 给定区间[n,m] 问此区间内合法的号码的个数 分析:数位dp dp[i][j]代表 最高位为 j 的 i 位数有多少个合法的 然后按题目规则进行转 ...

  5. 关于我们-EIBOA易博男装-互联网品质男装品牌-在线销售男士西服,衬衫,外套,西裤,领带|全场免运费,30天退换货保障

    关于我们 - 网站底部 | ELLE中国 | ELLE China 关于赫斯特国际集团 男人尚--专注男人时尚 关于男人尚 这些数据,你知道吗? 1.全国至少1亿男人的衬衫尺码错误: 2.57%的男人 ...

  6. input文本框获取焦点和失去焦点判断

    onBlur:当输入框失去焦点后 onFocus:当输入框获得焦点后 这两个JavaScript事件是写在html标签中的例如: <input type="text" onB ...

  7. <Win32_6>程序员求爱的创意程序^_^

    作为程序员,我们时常被外界误认为很闷.不浪漫.没创意……等等这一类人,这让我们实在有些感伤啊,我得为程序员呐喊一声: 我们也能可以欢快.浪漫.有创意…… 朋友,你向女生表白过吗? …… 这个问题有点儿 ...

  8. .net网站开发(一):1.input表单元素

    其实,在半年前我对网站开发还是完全不感冒的,不是没认识,而是只认识到表面.我以为网站模型就那几样,新闻.论坛.博客啥的,仿个站出来有什么意思?但现在我是知道了,大多应用开发还是采用B/S架构的,包括服 ...

  9. Oracle 监听配置详解(转载)

        使用ORACLE的SQL*Net V.2连接客户机和服务器,需配置每个客户机和服务器.在服务器上需配置的文件有:listener.ora./etc/services,在客户机上需配置tnsna ...

  10. 远程连接到Fedora

    首先执行以下3点(主要是前两点) 第一: 开启ssh #service sshd restart 第二:关闭防火墙 #service iptables stop 第三:selinux(重启电脑后失效) ...