原创 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条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条