在計算機應用中,經常需要檢視二進位制檔案的內容。目前,在各種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 這個引...