⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hexreader.cpp

📁 一款不错的关于串口升级硬件的软件
💻 CPP
字号:
#include "stdafx.h"
#include "stdio.h"

extern CString szIniFileName;
extern CString szDownLoadFileName;
extern CStringArray szIniFileBuff;
CString szIniDownLoadFile;
UINT uiSeekPos;

UINT CheckHexFileRow(CString *string)
{
	UINT temp,len,pos=0,checksum=0;
	len = string->GetLength();
	if(!(len&0x1)) return FALSE;
	while(pos<len)
	{
		switch(pos)
		{
		case 0:
			if(string->GetAt(pos++)!=':') return FALSE;
			break;
		default:
			temp = (string->GetAt(pos)-0x30)*0x10+(string->GetAt(pos+1)-'0');
			pos+=2;
		}
	}
	if(checksum!=0) return FALSE;
	return TRUE;
}

UINT GetHexFileBYTE(CString *string,UINT pos)
{
	BYTE hi,lo;
	hi = string->GetAt(pos);
	hi = (hi > '9')?(hi-'A'+10):(hi - '0');
	lo = string->GetAt(pos+1);
	lo = (lo > '9')?(lo-'A'+10):(lo - '0');
	return hi*0x10+lo;
}

// :llaaaatt[dd...]cc
// ll   - length
// aaaa - address
// tt   - type
// [dd...] - data
// cc   - cs

BYTE ReadHexFile(BYTE *buff, CString filename,UINT *start_addr,UINT *end_addr)
{
	CString rString;
	unsigned long filesize=0;
	UINT ll,tt,pos,linear_addr=0,segment_addr=0;
	UINT mem_addr,start_address,end_address;
	CStdioFile stdfile;
	if(stdfile.Open(filename,CStdioFile::modeRead,NULL)==NULL)
	{
		return FALSE;
	}
	else
	{
		start_address = (UINT)-1;
		end_address = 0;
		while(stdfile.ReadString(rString)!=NULL)
		{
			if(!CheckHexFileRow(&rString)) break;
			pos = 1;
			ll = GetHexFileBYTE(&rString,pos);
			pos+=2;
			mem_addr = linear_addr * 0x10000;
			mem_addr += segment_addr * 0x10;
			mem_addr += GetHexFileBYTE(&rString,pos)*0x100;
			pos += 2;
			mem_addr += GetHexFileBYTE(&rString,pos);
			pos += 2;
			tt = GetHexFileBYTE(&rString,pos);
			pos += 2;
			switch(tt)
			{
			case 0x0:		// data record
				if(mem_addr < start_address) start_address = mem_addr;
				while(ll--)
				{
					buff[mem_addr++]=GetHexFileBYTE(&rString,pos);
					pos += 2;
				}
				if(mem_addr > end_address) end_address = mem_addr;
				break;
			case 0x1:		// end of file record
				*start_addr = start_address;
				*end_addr = end_address;
				stdfile.Close();
				return TRUE;
				break;
			case 0x2:		// extended segment address record
				while(ll--)
				{
					segment_addr *= 0x100;
					segment_addr += GetHexFileBYTE(&rString,pos);
					pos += 2;
				}
				break;
			case 0x4:		// extended linear address record
				linear_addr = 0;
				while(ll--)
				{
					linear_addr *= 0x100;
					linear_addr += GetHexFileBYTE(&rString,pos);
					pos += 2;
				}
				break;
			default:
				break;
			}
		}
		stdfile.Close();
	}
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -