[原创]Hex转Bin程序(无64K限制)
在网上一直找不到可以转换大于64K的Hex转Bin,早上花了点时间,自己写了代码.
现将代码生成一个简单的转换工具,以方便大家!!!
修改了一处内存没有释放的BUG.
点击此处下载 ourdev_303716.rar(文件大小:129K) (原文件名:HexToBin.rar) 可不可以上传源码? winhex带有这功能 我下载转换96kb的hex出现转换成功数据为0.怎么回事呀 一般,装了Hjtag后有一个附带的,多格式转换器,就不再用其他的类似的转换软件了。 jh 强烈支持 收藏了哈哈 回复【楼主位】wenunit 龙啸苍天
-----------------------------------------------------------------------
强烈支持 “0x0040110c"指令引用的"0x09897858"內存。該內存不能為"written"。
要終止程序,請單擊"確定"。
…… 一般的烧录软件加载HEX文件后另存为BIN格式就行了. 支持AVR吗 刚刚在win7先用了一下,直接死掉了 本帖最后由 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;
//} tomhe666 发表于 2013-3-28 21:12 static/image/common/back.gif
我来贴个HEX文件转二进制的源码,从我写的一个加密BOOTLOADER固件程序中截取,支持扩展HEX文件(大于64KB) ...
老大,bin文件怎么通过hex文件在mfc下转化? 网上的例子都是控制台下的,没办法对bin文件加密,再写flash呀。 下下来试试。 亲测,打开文件后,闪退,没有用。 亲测,win7 64bit 可用
谢谢楼主,要是能直接在命令行调用就好了
下载了可以用
找这个找了好久 可算找到了。 不能用,有问题~~ 转换6K的HEX,得到的BIN文件只有50多字节。靠,国产货就是不靠谱。 似乎不能用啊! 哥们,被你害惨了啊{:cry:},hex转的bin没有用,让我被bootload搞死(你过来我保证不打死你----{:lol:})。麻烦看看程序中有什么错吧。给后面的朋友推介下hex2bin 谢了............. 学习学习!
页:
[1]