前言
在某些场景需要读取Hex文件的内容时,不能像Bin文件一样直接读取数据,因为hex文件的数据是经过组合处理的,需要根据hex的格式,进行一定的操作,将文件的真实数据提取出来。
一、Hex文件的格式
HEX 文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII 文本文件。下面简单了解Hex文件里面的每一行格式。
下面打开一个hex文件看看。
HEX格式文件以行为单位记录数据,每行都由任意数量的十六进制数组成。
每一行的格式如下:
:本行数据长度(2byte)+数据起始地址(4byte)+数据类型(2byte)+数据内容(N byte)+校验(1byte)
数据类型代表意思:
二、获取Hex文件的内容
核心思想就是打开文件后,根据格式,从每一行中将数据内容(N byte)取出来。
程序如下:
void CDownloadDlg::Download_Hex_File(CString fileName)
{
CStdioFile hexFile;
CString fileLineStr;
char *dataBuff = new char[APP_DOWNLOAD_HEX_BUFF_SIZE];
ULONGLONG dataBuffLen = APP_DOWNLOAD_HEX_BUFF_SIZE;
ULONGLONG total = 0;
WORD filePacketIndex = 0;
if (TRUE == hexFile.Open(fileName, CFile::modeRead))
{
memset(dataBuff, 0xFF, dataBuffLen);
while (hexFile.ReadString(fileLineStr))
{
if (fileLineStr.GetAt(0) == 0x3A) // 0x3A = ":"
{
DWORD len = hexStr2char(fileLineStr.GetAt(1), fileLineStr.GetAt(2));
BYTE addrH = hexStr2char(fileLineStr.GetAt(3), fileLineStr.GetAt(4));
BYTE addrL = hexStr2char(fileLineStr.GetAt(5), fileLineStr.GetAt(6));
BYTE dataType = hexStr2char(fileLineStr.GetAt(7), fileLineStr.GetAt(8));
DWORD addr = (addrH << 8) + addrL;
if (addr + len > total) // 获取文件最大的地址,即为文件长度
{
total = addr + len;
}
if (total > dataBuffLen - 64) //预留64个空间,申请空间不足,必须再申请空间
{
char *temp = dataBuff; //将原来数据指针存在temp中
/* 新申请空间,每次申请增加大小为APP_DOWNLOAD_HEX_BUFF_SIZE */
dataBuff = new char[dataBuffLen + APP_DOWNLOAD_HEX_BUFF_SIZE];
memset(dataBuff, 0xFF, dataBuffLen + APP_DOWNLOAD_HEX_BUFF_SIZE);
memcpy(dataBuff, temp, dataBuffLen); //把原来数据拷贝到新空间中
dataBuffLen += APP_DOWNLOAD_HEX_BUFF_SIZE;
delete[] temp; //释放原有数据的内存
}
if (dataType == 0x01) /* 文件结束 */
{
break;
}
switch (dataType)
{
case 0x00: /* '00' Data Record 数据记录 */
{
for (BYTE i = 0; i < len; i++)
{
dataBuff[addr + i] = hexStr2char(fileLineStr.GetAt(i * 2 + 9), fileLineStr.GetAt(i * 2 + 10)); //读取数据存放在dataBuff
}
break;
}
case 0x01:
{
break;
}
case 0x02:
{
break;
}
case 0x03:
{
break;
}
case 0x04:
{
break;
}
case 0x05:
{
break;
}
default:
{
break;
}
}
}
}
hexFile.Close();
/* dataBuff[]即为取出的数据 */
/* 对dataBuff[]进行操作 。。。。。。。。。*/
delete[] dataBuff;
}
}
dataBuff即为取出的数据,可根据需求进行操作即可。