如何获取Hex文件的数据?(Hex转Bin方法)

文章目录


前言

在某些场景需要读取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即为取出的数据,可根据需求进行操作即可。

### Windows 11 搜索栏加载不出来解决方案 对于Windows 11搜索栏无法加载的问题,可能的原因涉及系统文件损坏、索引服务异常或是某些后台应用程序冲突。下面提供几种有效的解决办法。 #### 方法一:重启Windows资源管理器 有时简单的操作即可解决问题。尝试通过任务管理器结束并重新启动“Windows 资源管理器”进程。这通常能快速恢复搜索功能的工作状态[^1]。 #### 方法二:创建新的用户配置文件 如果仅限于当前用户的搜索出现问题,则可能是个人设置被破坏所致。建立一个新的本地账户测试是否依然存在相同状况可以帮助定位问题所在。如果是新账号下正常工作,则考虑备份数据后迁移至新用户环境中继续使用。 #### 方法三:运行SFC扫描修复受损的系统组件 如同处理其他类型的系统错误一样,利用内置工具`SFC /SCANNOW`命令来查找并修正任何潜在影响到核心程序运作的坏损文件也是必要的步骤之一。需要注意的是应当确保是以具备最高权限的方式开启命令行界面来进行此操作。 ```powershell sfc /scannow ``` #### 方法四:调整执行策略允许脚本运行 考虑到部分情况下的问题是由于安全限制引起——特别是当涉及到第三方插件或自定义脚本时,适当放宽Powershell中的执行政策也许能够解除障碍。具体做法是在获得充分授权的情况下更改execution policy为RemoteSigned模式[^3]: ```powershell Set-ExecutionPolicy RemoteSigned ``` 以上措施涵盖了从简易排查直至深入干预的不同层面应对之策,适用于大多数因不同原因造成的Win11搜索功能失效情形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值