📄 hexbin.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 + -