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