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

📄 hexshowdoc.cpp

📁 以二进制显示数据
💻 CPP
字号:
// HexShowDoc.cpp : implementation of the CHexShowDoc class
//

#include "stdafx.h"
#include "HexShow.h"
#include "string.h"

#include "HexShowDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CHexShowDoc

IMPLEMENT_DYNCREATE(CHexShowDoc, CDocument)

BEGIN_MESSAGE_MAP(CHexShowDoc, CDocument)
	//{{AFX_MSG_MAP(CHexShowDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHexShowDoc construction/destruction

CHexShowDoc::CHexShowDoc()//构造函数
{
	// TODO: add one-time construction code here
	//增加初始化代码
	m_nBytesPerLine=16;///每行显示16个字节,每次读的字节数
	m_lFileLength=0L;
	m_pHexFile=NULL;
	m_SaveFile=NULL;
	font_data=0;
	font_data1=0;
	font_data2=0;
	font_tag=0;
}

CHexShowDoc::~CHexShowDoc()
{//在析构函数中增加代码
    if (m_pHexFile !=NULL)
	{
		m_pHexFile->Close();
		delete m_pHexFile;
		m_pHexFile=NULL;
	}


   if (m_SaveFile !=NULL)
	{
		m_SaveFile->Close();
		delete m_SaveFile;
		m_SaveFile=NULL;
	}



}

BOOL CHexShowDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CHexShowDoc serialization

void CHexShowDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CHexShowDoc diagnostics

#ifdef _DEBUG
void CHexShowDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CHexShowDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHexShowDoc commands

BOOL CHexShowDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{

	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	// TODO: Add your specialized creation code here
	//编辑消息处理函数
	if(m_pHexFile!=NULL)
	{
			m_pHexFile->Close();
		delete m_pHexFile;
	}
	
	
	m_pHexFile=new CFile(lpszPathName,CFile::modeReadWrite|CFile::typeBinary);

	
	if (!m_pHexFile)
	{
		AfxMessageBox("文件打开出错!");
		return FALSE;
	}
	m_lFileLength=m_pHexFile->GetLength();
	return TRUE;
}

BOOL CHexShowDoc::ReadFileAndProcess(CString &strLine, long lOffset)
{
	long lPos;
	if (lOffset !=-1)
		lPos=m_pHexFile->Seek(lOffset,CFile::begin);
	else
		lPos=m_pHexFile->GetPosition();
	unsigned char szBuf[16];
	int nRet =m_pHexFile->Read(szBuf,m_nBytesPerLine);
	if (nRet<=0)
		return FALSE;
	CString sTemp;
	CString sChars;
	CString str;
	CString str1;
	CString str2;
	//int  font_data=0;
	//int  font_data1=0;
	//int  font_data2=0;



    CString  cstring;



	sTemp.Format(_T("%8.8X: "),lPos);//格式化地址
	strLine=sTemp;
	for (int i=0;i<nRet; i++)
	{
		if (i==0)
			sTemp.Format(_T("%2.2X"),szBuf[i]);
		else if (i%16==0)
			sTemp.Format(_T(" %2.2X"),szBuf[i]);
		else if (i%8==0)
			sTemp.Format(_T("-%2.2X"),szBuf[i]);
		else
			sTemp.Format(_T(" %2.2X"),szBuf[i]);
		
		
//		if (_istprint(szBuf[i]))//不能显示显示"."
//			 sChars +=szBuf[i];
//				else
//					{
//					sChars +=_T('.');
//					}


		strLine +=sTemp;
	}
	
//**************************************************************
for ( i=0;i<16; i++)//生成屏右部分显示内容
{
	 font_data1=szBuf[i];

		if (font_data1>=32&&font_data1<=126)//能打印字符
			{
				if(font_tag>0)//前一个是半个汉字,还未配对使用掉
					{sChars +=_T('.');}
				str=font_data1;
				sChars +=str;
				font_tag=0;
			}
	
		if (font_data1<=31||font_data1==127 )//不是汉字,又不能打印
			{
				if(font_tag>0)//前一个是半个汉字
						{sChars +=_T('.');}
				sChars +=_T('.');
				font_tag=0;
			}
		
		
		
		if (font_data1>127)	//汉字
			{
				if(font_tag>0)//前一个是半个汉字
				{
					str1=font_data2;
					str2=font_data1;
					str=str1+str2;
					sChars +=str;
					font_tag=0;
				}
				else//前一个不是汉字,不累加,留到下一个去判断
				{
					font_tag=1;
					font_data2=font_data1;	
				}


			}

}//for 循环结束
//***********************************************************

//*********************************************
	if (nRet<m_nBytesPerLine)
	{
		CString sPad (_T(' '),2+3*(m_nBytesPerLine-nRet));
		strLine +=sPad;
	}
	strLine +=_T("  ");
//*********************************将欲显示的内容保存到文件中
m_SaveFileData=m_SaveFileData+char(13)+char(10)+strLine; 
//******************	
	strLine +=sChars;
	return TRUE;

}
int  CHexShowDoc::ReadFiledata(long lOffset)
{
	long lPos;
	if (lOffset !=-1)
		lPos=m_pHexFile->Seek(lOffset,CFile::begin);
	else
		lPos=m_pHexFile->GetPosition();
	unsigned char szBuf[16];
	int nRet =m_pHexFile->Read(szBuf,16);
	if (nRet<=0)
		return FALSE;



	return  szBuf[0];
}


//************************保存文件
BOOL CHexShowDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{	// TODO: Add your specialized creation code here
	//编辑消息处理函数
	CString  str;
	char   lpszPathNameTXT[100];
	char  buff;

int i=0;
while(*lpszPathName!='\0')
{
	buff	=*lpszPathName;		
	lpszPathNameTXT[i]=buff;
	lpszPathName++;

	i++;
}

lpszPathNameTXT[i]='.';//使文件自动加上“。txt”
i++;
lpszPathNameTXT[i]='t';
i++;
lpszPathNameTXT[i]='x';
i++;
lpszPathNameTXT[i]='t';
i++;
lpszPathNameTXT[i]='\0';

lpszPathName=&lpszPathNameTXT[0];

 	if(m_SaveFile!=NULL)
	{
		m_SaveFile->Close();
		delete m_SaveFile;
	}
	m_SaveFile=new CFile(lpszPathName,CFile::modeCreate |CFile::modeWrite);

	if (!m_SaveFile)
	{
		AfxMessageBox("保存文件出错!!");
		return FALSE;
	}

	m_SaveFile->Write(m_SaveFileData, 1887);//写文件头



	m_SaveFile->Close();
	delete m_SaveFile;
	m_SaveFile=NULL;


	return TRUE;

	
}
void CHexShowDoc::Write(unsigned char  szBuf[10],int datalength,  long lOffset)
{
	m_pHexFile->Seek(lOffset,CFile::begin);
	m_pHexFile->Write(szBuf,datalength);

}

⌨️ 快捷键说明

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