wenunit 发表于 2008-6-7 12:24:04

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

在网上一直找不到可以转换大于64K的Hex转Bin,
早上花了点时间,自己写了代码.
现将代码生成一个简单的转换工具,以方便大家!!!


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

manbkk 发表于 2008-6-11 18:35:31

可不可以上传源码?

gmen_pliskin 发表于 2008-6-11 18:44:44

winhex带有这功能

cuiyl 发表于 2009-2-28 12:42:51

我下载转换96kb的hex出现转换成功数据为0.怎么回事呀

suaige 发表于 2009-2-28 14:18:04

一般,装了Hjtag后有一个附带的,多格式转换器,就不再用其他的类似的转换软件了。

ndust 发表于 2009-2-28 14:37:11

jh

everich 发表于 2009-3-9 15:46:40

强烈支持

deepin 发表于 2009-4-17 13:39:34

收藏了哈哈

alextata 发表于 2010-4-13 11:57:56

回复【楼主位】wenunit 龙啸苍天
-----------------------------------------------------------------------

强烈支持

dukedz 发表于 2010-7-10 13:09:24

“0x0040110c"指令引用的"0x09897858"內存。該內存不能為"written"。
要終止程序,請單擊"確定"。
……

cowboy 发表于 2010-7-10 13:21:04

一般的烧录软件加载HEX文件后另存为BIN格式就行了.

mainbp 发表于 2013-3-3 09:34:55

支持AVR吗

nongxiaoming 发表于 2013-3-28 17:10:40

刚刚在win7先用了一下,直接死掉了

tomhe666 发表于 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 == '\r' && pBuff == '\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; //申请空间
             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 != ':' || 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);
      }
      checksum = (~checksum)+1;
      if(checksum != Hex2Bin(CString(strHexLine)+strHexLine))
      {
            if(pDataBuff != NULL)delete[] pDataBuff;
            return HEX_TRANSLATE_ERROR_CHECKSUM; //校验和错误
      }
      linetype = Hex2Bin(CString(strHexLine)+strHexLine);
      bytecount =Hex2Bin(CString(strHexLine)+strHexLine);
      addr =Hex2Bin(CString(strHexLine)+strHexLine+strHexLine+strHexLine);

      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 = Hex2Bin(CString(strHexLine) + strHexLine);
                  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)+ strHexLine + strHexLine + strHexLine);
            exaddr <<= 4;
            break;
      case 4: //计算扩展地址,并左移16位
            if(bytecount != 2) //后面必须有扩展的地址
            {
                if(pDataBuff != NULL)delete[] pDataBuff;
                return HEX_TRANSLATE_ERROR_SYNTAX;
            }
            exaddr = Hex2Bin(CString(strHexLine)+ strHexLine + strHexLine + strHexLine);
            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                           ABCDEF
        static UINTnumtab[]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15};
    static UINTpowtab[]={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-'0'] * powtab);
    }

        return value;
}


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

leahcim89 发表于 2013-7-18 21:02:11

tomhe666 发表于 2013-3-28 21:12 static/image/common/back.gif
我来贴个HEX文件转二进制的源码,从我写的一个加密BOOTLOADER固件程序中截取,支持扩展HEX文件(大于64KB) ...

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

leahcim89 发表于 2013-7-20 23:16:52

下下来试试。

leahcim89 发表于 2013-7-24 15:11:20

亲测,打开文件后,闪退,没有用。

ksswang 发表于 2013-8-6 10:50:13

亲测,win7 64bit 可用
谢谢楼主,要是能直接在命令行调用就好了

panlixin 发表于 2014-2-23 11:15:34

下载了可以用

richards 发表于 2014-2-23 13:08:55

找这个找了好久 可算找到了。

智涅 发表于 2014-4-8 21:07:02

不能用,有问题~~

pangjineng 发表于 2014-6-17 08:36:24

转换6K的HEX,得到的BIN文件只有50多字节。靠,国产货就是不靠谱。

茶亦爽 发表于 2014-6-20 17:17:41

似乎不能用啊!

pregnant 发表于 2014-7-6 15:04:41

哥们,被你害惨了啊{:cry:},hex转的bin没有用,让我被bootload搞死(你过来我保证不打死你----{:lol:})。麻烦看看程序中有什么错吧。给后面的朋友推介下hex2bin

hanshiruo 发表于 2015-5-4 15:09:08

谢了.............

zyicc 发表于 2015-6-28 18:24:34

学习学习!
页: [1]
查看完整版本: [原创]Hex转Bin程序(无64K限制)