电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

HEX转BIN源码分析(51系列)

以前写的一个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='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;
}*

博主
xnwxq@126.com
☆☆ 雪融无声 ☆☆
wangxing
点击跳转