搜索
bottom↓
回复: 25

[原创]Hex转Bin程序(无64K限制)

[复制链接]

出0入0汤圆

发表于 2008-6-7 12:24:04 | 显示全部楼层 |阅读模式
在网上一直找不到可以转换大于64K的Hex转Bin,
早上花了点时间,自己写了代码.
现将代码生成一个简单的转换工具,以方便大家!!!


修改了一处内存没有释放的BUG.
点击此处下载 ourdev_303716.rar(文件大小:129K) (原文件名:HexToBin.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2008-6-11 18:35:31 | 显示全部楼层
可不可以上传源码?

出0入0汤圆

发表于 2008-6-11 18:44:44 | 显示全部楼层
winhex带有这功能

出0入0汤圆

发表于 2009-2-28 12:42:51 | 显示全部楼层
我下载转换96kb的hex出现转换成功数据为0.怎么回事呀

出0入0汤圆

发表于 2009-2-28 14:18:04 | 显示全部楼层
一般,装了Hjtag后有一个附带的,多格式转换器,就不再用其他的类似的转换软件了。

出0入0汤圆

发表于 2009-2-28 14:37:11 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-3-9 15:46:40 | 显示全部楼层
强烈支持

出0入0汤圆

发表于 2009-4-17 13:39:34 | 显示全部楼层
收藏了哈哈

出0入0汤圆

发表于 2010-4-13 11:57:56 | 显示全部楼层
回复【楼主位】wenunit 龙啸苍天
-----------------------------------------------------------------------

强烈支持

出0入0汤圆

发表于 2010-7-10 13:09:24 | 显示全部楼层
“0x0040110c"指令引用的"0x09897858"內存。該內存不能為"written"。
要終止程序,請單擊"確定"。
……

出0入0汤圆

发表于 2010-7-10 13:21:04 | 显示全部楼层
一般的烧录软件加载HEX文件后另存为BIN格式就行了.

出10入0汤圆

发表于 2013-3-3 09:34:55 | 显示全部楼层
支持  AVR吗  

出0入0汤圆

发表于 2013-3-28 17:10:40 | 显示全部楼层
刚刚在win7先用了一下,直接死掉了

出0入0汤圆

发表于 2013-3-28 21:12:07 | 显示全部楼层
本帖最后由 tomhe666 于 2013-3-28 21:25 编辑

我来贴个HEX文件转二进制的源码,从我写的一个加密BOOTLOADER固件程序中截取,支持扩展HEX文件(大于64KB),程序用VC写的,如果转成C通用,需要改写字符串处理部分,希望各位网友用得上

#include "stdafx.h"

#define HEX_TRANSLATE_ERROR_NONE        0   //无错误返回
#define HEX_TRANSLATE_ERROR_NOSPACE    -1   //未指定存储空间
#define HEX_TRANSLATE_ERROR_OVERFLOW   -2   //存储空间溢出
#define HEX_TRANSLATE_ERROR_SYNTAX     -3   //语法错误
#define HEX_TRANSLATE_ERROR_CHECKSUM   -4   //校验和错误
#define HEX_TRANSLATE_ERROR_OPENFILE   -5   //文件打开失败


//INT ReadHexFileInBuff(LPCTSTR filename, BYTE* pData,  UINT MaxDataSize)
INT ReadHexFile(LPCTSTR filename, BYTE* pData,  UINT MaxDataSize);
UINT Hex2Bin(CString hexstr);
bool ReadLineInBuff(CString& strLine, const CHAR* pBuff, UINT nSize, bool bInit);

//===============================================================================
//从文S本缓冲区中读取一行HEX文本
bool ReadLineInBuff(CString& strLine, const CHAR* pBuff, UINT nSize, bool bInit)
{
    static UINT nStart;
    static UINT nPos;   
    if(bInit)
    {
         nStart = 0;
         nPos = 0;
         return true;
    }

    if(nStart >= nSize)
    {
        return false;
    }


    for(nPos=nStart; nPos<nSize; nPos++)
    {
        if(pBuff[nPos] == '\r' && pBuff[nPos+1] == '\n')
        {
             UINT len = nPos - nStart;
             memcpy(strLine.GetBufferSetLength(len), pBuff+nStart, len);
             strLine.ReleaseBufferSetLength(len);
             nStart = nPos+2;
             return true;
        }        
    }

    //最后一行没"\r\n"
    UINT len  = nPos-nStart;
    memcpy(strLine.GetBufferSetLength(len), pBuff+nStart,len); //拷贝数据
    strLine.ReleaseBufferSetLength(len);
    nStart = nSize;
    return true;
}

//------------------------------------------------------------------------------
//转换HEX码到二进制数据,并把这些数据写到指定缓冲中的指定位置,该位置同HEX文档指定,仅需提供一个缓冲区指针pData
INT ReadHexFile(LPCTSTR filename, BYTE* pData,  UINT MaxDataSize)
{       
    CFile hexfile;
    UINT nSize;
    CHAR* pDataBuff = NULL;

    if(hexfile.Open(filename,CFile::modeRead))
    {
         nSize = (UINT)hexfile.GetLength();
         if(nSize > 0)
         {
             pDataBuff = new CHAR[nSize]; //申请空间
             hexfile.Read(pDataBuff, nSize); //内容读取到缓冲中
             hexfile.Close();
         }
         else
         {
              if(pDataBuff != NULL)delete[] pDataBuff;
              return HEX_TRANSLATE_ERROR_SYNTAX; //空字节,语法错误
         }
    }
    else
    {
        if(pDataBuff != NULL)delete[] pDataBuff;
        return HEX_TRANSLATE_ERROR_OPENFILE;
    }

    if(MaxDataSize == 0 || pData == NULL)
    {
        if(pDataBuff != NULL)delete[] pDataBuff;
        return HEX_TRANSLATE_ERROR_NOSPACE; //无有效存储空间
    }

    UINT bytecount;        //某行的数据字节数d
    BYTE checksum;         //二进制数据
    UINT linetype;         //行的类型
    UINT32 addr,exaddr=0;  //标示地址和护展地址       

    CString strHexLine;
    ReadLineInBuff(strHexLine, pDataBuff, nSize, TRUE); //初始化   
    while(ReadLineInBuff(strHexLine, pDataBuff, nSize, false))
    {
        strHexLine.Trim(); //去除首尾空格
        strHexLine.MakeUpper(); //全部大写
        if(strHexLine.IsEmpty())
        {
            if(pDataBuff != NULL)delete[] pDataBuff;
            return HEX_TRANSLATE_ERROR_NONE; //空行不处理
        }

        UINT ch_count = strHexLine.GetLength();

        if(strHexLine[0] != ':' || ch_count<11)
        {
            if(pDataBuff != NULL)delete[] pDataBuff;
            return HEX_TRANSLATE_ERROR_SYNTAX; //首字符不为":",语法错误
        }

        checksum = 0;

        for(UINT i=1; i<ch_count-3; i+=2)
        {
            checksum += Hex2Bin(CString(strHexLine)+strHexLine[i+1]);
        }
        checksum = (~checksum)+1;
        if(checksum != Hex2Bin(CString(strHexLine[ch_count-2])+strHexLine[ch_count-1]))
        {
            if(pDataBuff != NULL)delete[] pDataBuff;
            return HEX_TRANSLATE_ERROR_CHECKSUM; //校验和错误
        }
        linetype = Hex2Bin(CString(strHexLine[7])+strHexLine[8]);
        bytecount =  Hex2Bin(CString(strHexLine[1])+strHexLine[2]);
        addr =  Hex2Bin(CString(strHexLine[3])+strHexLine[4]+strHexLine[5]+strHexLine[6]);

        switch(linetype)
        {
        case 0: //数据记录
            {
                UINT32 cur_addr = addr + exaddr;
                if(cur_addr >= MaxDataSize)
                {       
                    if(pDataBuff != NULL)delete[] pDataBuff;
                    return HEX_TRANSLATE_ERROR_OVERFLOW;//数据超出界限
                }
                for(UINT i=0; i<(bytecount+bytecount); i+=2)
                {
                    pData[cur_addr] = Hex2Bin(CString(strHexLine[i+9]) + strHexLine[i + 10]);
                    cur_addr++;
                }
            }
            break;
        case 1:
            if(pDataBuff != NULL)delete[] pDataBuff;
            return HEX_TRANSLATE_ERROR_NONE; //HEX文件结束记录
            break;

        case 2: //计算扩展地址,并左移4位
            if(bytecount != 2) //后面必须有扩展的地址
            {       
                if(pDataBuff != NULL)delete[] pDataBuff;
                return HEX_TRANSLATE_ERROR_SYNTAX;
            }
            exaddr = Hex2Bin(CString(strHexLine[9])+ strHexLine[10] + strHexLine[11] + strHexLine[12]);
            exaddr <<= 4;
            break;
        case 4: //计算扩展地址,并左移16位
            if(bytecount != 2) //后面必须有扩展的地址
            {
                if(pDataBuff != NULL)delete[] pDataBuff;
                return HEX_TRANSLATE_ERROR_SYNTAX;
            }
            exaddr = Hex2Bin(CString(strHexLine[9])+ strHexLine[10] + strHexLine[11] + strHexLine[12]);
            exaddr <<= 16;
            break;
        case 3:
            break;
        default:
            break;
        }       
    }

    if(pDataBuff != NULL)delete[] pDataBuff;
    return HEX_TRANSLATE_ERROR_NONE; //正常结束
}



//------------------------------------------------------------------------------
//16进制字串转二进制
UINT Hex2Bin(CString hexstr)
{                //0 1 2 3 4 5 6 7 8 9                             A  B  C  D  E  F
        static UINT  numtab[]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15};
    static UINT  powtab[]={1,16,256,4096};

        ULONG value=0;

        hexstr.MakeUpper(); //转换为大写
       

        if(hexstr.GetLength()> 4)return 0; //不能超过四位的长度

        for(INT i=0; i<hexstr.GetLength(); i++)
        {
                if(hexstr<'0')return 0;
                if(hexstr>'F')return 0;
                if(hexstr>'9' && hexstr<'A')return 0;
        }

    UINT j=0;
    for(UINT i=hexstr.GetLength(); i>0; i--)
    {
        value += (numtab[hexstr[i-1]-'0'] * powtab[j++]);
    }

        return value;
}


//
//CString Bin2Hex(UINT value, UINT len)
//{
//        CString hexstr;
//    hexstr.Format("%X",value);   
//        return hexstr;
//}

出0入0汤圆

发表于 2013-7-18 21:02:11 | 显示全部楼层
tomhe666 发表于 2013-3-28 21:12
我来贴个HEX文件转二进制的源码,从我写的一个加密BOOTLOADER固件程序中截取,支持扩展HEX文件(大于64KB) ...

老大,bin文件怎么通过hex文件在mfc下转化? 网上的例子都是控制台下的,没办法对bin文件加密,再写flash呀。

出0入0汤圆

发表于 2013-7-20 23:16:52 | 显示全部楼层
下下来试试。

出0入0汤圆

发表于 2013-7-24 15:11:20 | 显示全部楼层
亲测,打开文件后,闪退,没有用。

出0入0汤圆

发表于 2013-8-6 10:50:13 | 显示全部楼层
亲测,win7 64bit 可用
谢谢楼主,要是能直接在命令行调用就好了

出0入0汤圆

发表于 2014-2-23 11:15:34 | 显示全部楼层
下载了可以用

出0入0汤圆

发表于 2014-2-23 13:08:55 | 显示全部楼层
找这个找了好久 可算找到了。

出40入518汤圆

发表于 2014-4-8 21:07:02 | 显示全部楼层
不能用,有问题~~

出0入0汤圆

发表于 2014-6-17 08:36:24 | 显示全部楼层
转换6K的HEX,得到的BIN文件只有50多字节。靠,国产货就是不靠谱。

出0入0汤圆

发表于 2014-6-20 17:17:41 | 显示全部楼层
似乎不能用啊!

出0入0汤圆

发表于 2014-7-6 15:04:41 | 显示全部楼层
哥们,被你害惨了啊,hex转的bin没有用,让我被bootload搞死(你过来我保证不打死你----)。麻烦看看程序中有什么错吧。给后面的朋友推介下hex2bin

出0入0汤圆

发表于 2015-5-4 15:09:08 | 显示全部楼层
谢了.............

出0入0汤圆

发表于 2015-6-28 18:24:34 | 显示全部楼层
学习学习!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 16:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表