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

📄 hexbin.cpp

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 CPP
字号:
// HEXBIN.h: interface for the HEXBIN class.
// HEX文件操作类1.0,暂时不支持扩展段和扩展线性地址
// 本代码由桃源村编写 2004.6.12
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HEXBIN.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

HEXBIN::HEXBIN()
{
	head=NULL; 
	offset=0;
	HEXSIZE=0;
	MAXADDR=0;
	pData=new Data;
}

HEXBIN::~HEXBIN()
{
	if(head==NULL)
	{
		return ;
	}
	noncep=head;

	for(;noncep!=head;noncep=head)
	{
		for(;noncep->next!=NULL;)
		{
			noncep=noncep->next;
		}
		delete [] noncep;
	}
	delete [] pData;
	delete [] head;
	delete [] Databuf;

}

int HEXBIN::LoadHEXFile(TCHAR *pPath)
{
	head=new record;
	head->next=0;
	UCHAR * pfile;
	HANDLE hFile = CreateFile(                   //建立并打开文件
				  pPath,           
               GENERIC_READ,              
                FILE_SHARE_WRITE|FILE_SHARE_READ,           
                NULL,                       
                OPEN_EXISTING,             
                FILE_ATTRIBUTE_NORMAL,    
                NULL);
	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		return false;
	}
	DWORD filesize=GetFileSize(hFile,NULL);
	DWORD returnsize=0;
	pfile=new UCHAR[filesize+64]; 
	ReadFile(hFile, pfile, filesize, &returnsize, NULL);
	UCHAR * pfilepos=pfile;
	Databuf=new UCHAR[filesize/2];
	UCHAR *Databufpos=Databuf;
	TCHAR str[8];
	unsigned short * str1=(unsigned short *)str;
	DWORD * str2=(DWORD *)str;
	memset(str,0,8);
	UINT pos=0;
	noncep=head;
//	DWORD fag=0;
	for(;;)
	{
		pfilepos++;
		str[0]=pfilepos[0];
		str[1]=pfilepos[1];
		pfilepos=pfilepos+2;
		noncep->ll=(UCHAR)HextoDec(str);//记录长度
		str[0]=pfilepos[0];
		str[1]=pfilepos[1];
		str[2]=pfilepos[2];
		str[3]=pfilepos[3];
		str[4]=0;
		str[5]=0;
		pfilepos=pfilepos+4;
		noncep->aaaa=(unsigned short)HextoDec(str);//记录地址
		str[2]=0;
		str[3]=0;
		str[0]=pfilepos[0];
		str[1]=pfilepos[1];
		if(MAXADDR<(noncep->aaaa+noncep->ll))
		{
			MAXADDR=noncep->aaaa+noncep->ll;
		}
		noncep->tt=(UCHAR)HextoDec(str);//记录类型
		pfilepos++;
		str[2]=0;
		str[3]=0;
		if((*pfilepos)!='0')
		{
			if((*pfilepos)=='1')//记录结束,记录类型01.现在暂不支持其他两种记录类型
			{
				noncep->next=NULL;
				noncep=head;
				CloseHandle(hFile);
				return true;
			}
			return false;
		}
		pfilepos++;
		for(pos=0;pos<noncep->ll;pos++)
		{
			str[0]=pfilepos[0];
		    str[1]=pfilepos[1];
			pfilepos=pfilepos+2;
			Databufpos[pos]=(UCHAR)HextoDec(str);
		}//翻译并拷贝数据到缓冲
		noncep->dd=Databufpos;
		str[0]=pfilepos[0];
		str[1]=pfilepos[1];
		str[2]=0;
		str[3]=0;
		noncep->cc=(UCHAR)HextoDec(str);
		pfilepos=pfilepos+4;
		Databufpos=Databufpos+noncep->ll;
		noncep->next=new record;
		noncep=noncep->next;
	}
	
	noncep->next=NULL;
	noncep=head;
	CloseHandle(hFile);
	delete [] pfile;
	return true;
	
}
int HEXBIN::HEXTOBINBUF(BYTE * pBUF, DWORD Size)
{
	record * p=head;
	BYTE * Bufpos=pBUF;
	DWORD size1=0;
	for(;(p->next)!=NULL;p=p->next)
	{
		if(p->aaaa>size1)
		{
			size1=p->aaaa+p->ll;
		}
	}
	if(Size<size1)
	{
		return false;
	}
	p=head;
	memset(pBUF,0xff,size1);
	for(;(p->next)!=NULL;p=p->next)
	{
		Bufpos=pBUF+p->aaaa;
		memcpy(Bufpos,p->dd,p->ll);
	}
	noncep=head;
	return true;

}
int HEXBIN::HEXTOBIN(TCHAR *pPath)
{
		HANDLE hFile = CreateFile(                   //建立并打开文件
				  pPath,           
               GENERIC_WRITE,              
                FILE_SHARE_WRITE|FILE_SHARE_READ,           
                NULL,                       
                CREATE_ALWAYS,             
                FILE_ATTRIBUTE_NORMAL,    
                NULL);
	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		return false;
	}
	record * p=head;
	DWORD size=0;
	DWORD size2=0;
	for(;(p->next)!=NULL;p=p->next)
	{
		if(p->aaaa>size2)
		{
			size2=p->aaaa+p->ll;
		}
	}//计算BIN文件大小
	p=head;
	UCHAR * filebuf=new UCHAR[size2];
	UCHAR * filepos=filebuf;
	memset(filebuf,0xff,size2);
	for(;(p->next)!=NULL;p=p->next)
	{
		filepos=filebuf+p->aaaa;
		memcpy(filepos,p->dd,p->ll);
	}
	noncep=head;
	WriteFile(hFile,filebuf,size2,&size,NULL);
	if(size!=size2)
	{
		delete [] filebuf;
		CloseHandle(hFile);
		return false;
	}
delete [] filebuf;
CloseHandle(hFile);
return true;
}

Data * HEXBIN::GetNextData()
{
	if(noncep->next==NULL)
	{
	 	pData->DataEOF=DEOF;
		return pData;
	}
	pData->address=noncep->aaaa+offset;
	pData->data=noncep->dd[offset];
	offset++;
	pData->DataEOF=NODEOF;
	if(offset==noncep->ll)
	{
		offset=0;
		if(noncep->next==NULL)
		{
	 		pData->DataEOF=DEOF;
			return pData;
		}
		noncep=noncep->next;
	}
	return pData;
}
int HEXBIN::HextoDec(TCHAR * p)
{
	int r = 0;
	TCHAR *str=p;
	while(*str)
	{
		r = r<<4;
		if((*str|0x20 ) >= 'a' &&(*str | 0x20) <= 'f')
		{
			r += ((*str|0x20 ) - 'a' + 10 );
		}
		else
		if(*str >= '0' && *str <= '9')
		{
			r += ((*str ) - '0');
		}
	str++;
	}
	return r;
}

UINT HEXBIN::GetHexDataSize()
{
	record * p=head;
	UINT Size=0;
	for(;p->next!=NULL;p=p->next)
	{
		Size=Size+p->ll;
	}
	Size=Size+p->ll;
	HEXSIZE=Size;
	return Size;
}

UINT HEXBIN::GetMaxAddr()
{
	DWORD size=0;
	record * p=head;
	for(;(p->next)!=NULL;p=p->next)
	{
		if(p->aaaa>size)
		{
			size=p->aaaa+p->ll-1;
		}
	}
	MAXADDR=size;
	return size;
}

⌨️ 快捷键说明

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