用VC 60 檢視二進位制檔案

2021-05-26 12:37:55 字數 3670 閱讀 8625

在計算機應用中,經常需要檢視二進位制檔案的內容。目前,在各種vc ++書籍中介紹檢視文字檔案的文章很多,但鮮有介紹檢視二進位制檔案的文章。本文從功能設計、方案設計、程式設計實現以及技術要點等方面來簡單介紹如何用vc ++60 檢視二進位制檔案。

一、功能設計

顯示介面將視窗客戶區劃分為三部分,左邊列用於以16 進製方式顯示檔案內容的相應位置,中間列用於以16 進製方式顯示檔案內容,右邊列用於顯示檔案內容對應的ascii 碼的內容。為簡化程式設計,沒有列印功能。

二、方案設計

採用mfc 的sdi(單文件介面)。由於在一屏內一般不可能顯示整個檔案的內容,所以選擇視類的基類為cscrollview。

二進位制檔案的讀出與處理在文件類中完成,檔案的顯示與滾動由視類來實現。

三、程式設計實現

2. 在文件類chexshowdoc 中增加檔案的讀出及處理工作

(1)定義文件的成員變數,做好初始化及清理工作

開啟hexshowdoc.h檔案,增加2個公共變數:

cfile *m_phexfile;

long m_lfilelength;

int m_nbytesperline;//每行顯示多少個byte

然後,開啟hexshowdoc.cpp檔案,

在類的建構函式中增加下列初始化**:

m_phexfile = null;

m_lfilelength = 0l;

m_nbytesperline=16;// 每行顯示16 個byte

在類的析構函式中增加下列清理**:

if (m_phexfile != null)

(2) 在onopendocument()中開啟文件

首先利用classwizard過載訊息成員函式

onopendocument()。在該成員函式的**新增處增加下列**:

if (m_phexfile != null)

m_phexfile = new cfile(lpszpathname,

cfile::moderead | cfile::typebinary);

if (!m_phexfile)

m_lfilelength = m_phexfile ->getlength();

(3)增加用於讀檔案及進行輸出

格式化處理的成員函式

為chexshowdoc類增加成員函式如下:

bool chexshowdoc::readfileandprocess

(cstring &strline, long loffset)

if (nret < m_nbytesperline)

strline += _t(" ");

strline += schars;

return true;

}3. 在視中新增顯示檔案內容以及處理滾動操作

(1)變數定義以及初始化:

a)開啟hexshowview.h檔案,增加成員變數如下:

cfont*m_pfont;//用於為顯示檔案內容選擇字型

b)在視的建構函式中為檔案內容顯示選擇合適的字型

//選擇一種名為「fixedsys"的字型,

該字型使得字元的排列整齊

logfont   m_logfont;

memset( &m_logfont, 0, sizeof(m_logfont));

_tcscpy(m_logfont.lffacename, _t("fixedsys"));

cclientdc dc(null);

m_logfont.lfheight=::muldiv(120, dc.getdevice ?

caps(logpixelsy), 720);

m_logfont.lfpitchandfamily = fixed_pitch;

m_pfont = new cfont;

m_pfont ->createfontindirect( &m_logfont);

c) 將chexshowview::oninitialupdate()

d) 中的**修改為:

cscrollview::oninitialupdate();

chexshowdoc *pdoc = getdocument();

assert_valid(pdoc);

csize sizetotal(0, pdoc ->m_lfilelength);

setscrollsizes(mm_text, sizetotal);

e)在視的析構函式中完成對字型物件的刪除,增加**如下:

if (m_pfont != null)

delete m_pfont;

(2)在視中的ondraw()中新增如下**:

chexshowdoc *pdoc = getdocument();

assert_valid(pdoc);

cfont *   poldfont;

cstring sline;  //用於顯示的文字行

csize scrolledsize; //視窗的客戶區的範圍

int istartline;//當前屏第一行顯示的行的索引號

int nheight;//輸出文字行的高度

crect scrollrect;

//獲得該屏滾動條的位置

cpoint scrolledpos=getscrollposition();

crect rectclient;

getclientrect( &rectclient);

//求出每行的高度(單位:象素數)

textmetric tm;//tm用於儲存庫存字型的引數;

pdc ->gettextmetrics( &tm);

nheight = tm.tmheight;

poldfont = pdc ->selectobject(m_pfont);

// 根據滾動,求出開始行

scrolledsize = csize(rectclient.width(),

rectclient.height());

scrollrect = crect(rectclient.left,

scrolledpos.y,rectclient.right,

scrolledsize.cy +

scrolledpos.y);

istartline = scrolledpos.y/16;

// make sure we are drawing where we should

scrollrect.top = istartline *nheight;

if (pdoc ->m_phexfile != null)

}pdc ->selectobject(poldfont);

4. 對該工程進行編譯、連線,形成執行檔案hexshow.exe

四、技術關鍵

通過上面介紹,可知該程式並不複雜。其涉及到的技術關鍵有4 條。

1. 利用文件/ 視架構能有效地降低軟體的複雜度,使文件專注於處理資料,而視由於繼承自cscrollview,則便於文字的顯示和滾動;

2. 選擇一種合適的字型非常重要,否則,可能出現顯示混亂的情況;

3. 選擇乙個正確的成員函式往往能起到事半功倍的效果,比如,進行文字輸出時,使用cdc::drawtext(...),就比使用常規的cdc::textout(...) 有很大的優點;

4. 不管滾動條處於什麼位置,視只顯示所涉及到的文字行。

二進位制檔案檢視工具 開發二進位制檔案靜態快速分析工具

眾人拾柴火焰高。工具一直都受到讀者的喜愛,只要有工具二字,文章的閱讀量都會多一些。所以,近來介紹推薦的工具類文章非常多。其實開發這個工具,是受到上篇文章的啟發,萌生了念頭。對二進位制檔案 exe dll bin sys等 的分析一直上工具類的排行榜,受到了非常多地關注。我們的工作主要是想通過靜態分析...

xxd檢視二進位制檔案

vim b edit binary using xxd format augroup binary au au bufreadpre bin let bin 1 au bufreadpost bin if bin xxd au bufreadpost bin set ft xxd endif au ...

vim檢視二進位制檔案

vim 來編輯二進位制檔案。vim 本非為此而設計的,因而有若干侷限。但你能讀 取乙個檔案,改動乙個字元,然後把它存檔。結果是你的檔案就只有那乙個字元給改了,其它的就跟原來那個一模一樣。要保證 vim 別把它那些聰明的竅門用錯地方,啟動 vim 時加上 b 引數 vim b datafile 這個引...