原创
HEX转BIN源码分析(51系列)
2008-8-19 10:53
4348
7
5
分类:
软件与OS
以前写的一个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=0;
int start_addr, start_addr_max=0;
int nEnd, n, bin_length=0;
if(!(fhex.Open(hexfile, CFile::modeRead, NULL))) //// 打开文件
return -1;
if(!(fbin.Open(binfile, CFile::modeCreate|CFile::modeWrite, NULL)))
return -1;
char *buffer = new char [fhex.GetLength()]; //// 分配内存
fhex.Read(buffer, fhex.GetLength());
pBuffer = buffer;
nEnd = pBuffer.Find(":00000001"); //// 以此来判断文件格式是否为HEX
if(nEnd < 0) //先判断文件结尾处
{
// AfxMessageBox("*.Hex文件转换失败(未找到\":00000001\"记录)!");
return -2;
}
n = 0;
while(n < nEnd) // 首先得到bin文件的长度
{
if(buffer[n] == ':')
{
CharToByte(&buffer[n+1], &len);
CharToByte(&buffer[n+3], &len1);
CharToByte(&buffer[n+5], &len2);
start_addr = (len1<<8) + len2; // 起始地址
/*
* 有的HEX文件中间会有"空洞",只靠计算前面每一行数据的大小
* 可能会出现错误,因此得到最大的地址值和最大地址值这一行的
* 数据大小来得到BIN文件的大小,实际上准确上因该采用此法,前
* 面的方法没有去掉,可以去掉
*
*/
if(start_addr >= start_addr_max)
{
start_addr_max = start_addr;
len_at_max = len;
}
bin_length += len;
n += len*2+11; // 没有加上回车符号
}
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]; //// 分配内存
for(int i="0"; i<bin_length; i++)
bbuf = 0xff;
n = 0;
while(n < nEnd) // 向BIN文件缓冲区写数据
{
if(buffer[n] == ':')
{
CharToByte(&buffer[n+1], &len);
CharToByte(&buffer[n+3], &len1);
CharToByte(&buffer[n+5], &len2);
start_addr = (len1<<8) + len2; // 起始地址
for(unsigned int i="0"; i<len; i++)
{
CharToByte(&buffer[n+9+i*2], &len1);
bbuf[start_addr+i] = len1;
}
n += len*2+11; // 没有加上回车符号
}
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[0]; //高4位
l = pChar[1]; //低4位
if(l>='0' && l<='9')
l = l - '0';
else if(l>='a' && l<='f')
l = l - 'a' + 0xa;
else if(l>='A' && l<='F')
l = l - 'A' + 0xa;
else
return FALSE;
if(h>='0' && h<='9')
h = h - '0';
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*16 + l;
return TRUE;
}
文章评论(0条评论)
登录后参与讨论