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