什么是二進(jìn)制文件二進(jìn)制文件的儲存方式
二進(jìn)制文件格式是系統(tǒng)軟件開發(fā)、病毒或木馬源碼分析以及文件壓縮工作的基礎(chǔ)。什么是二進(jìn)制文件呢?下面是學(xué)習(xí)啦小編整理的什么是二進(jìn)制文件,歡迎閱讀。
什么是二進(jìn)制文件
包含在 ASCII及擴(kuò)展 ASCII 字符中編寫的數(shù)據(jù)或程序指令的文件。計(jì)算機(jī)文件基本上分為二種:二進(jìn)制文件和 ASCII(也稱純文本文件),圖形文件及文字處理程序等計(jì)算機(jī)程序都屬于二進(jìn)制文件。這些文件含有特殊的格式及計(jì)算機(jī)代碼。ASCII 則是可以用任何文字處理程序閱讀的簡單文本文件。
二進(jìn)制文件定義
廣義的二進(jìn)制文件即指文件,由文件在外部設(shè)備的存放形式為二進(jìn)制而得名。狹義的二進(jìn)制文件即除文本文件以外的文件。文本文件是一種由很多行字符構(gòu)成的計(jì)算機(jī)文件。文本文件存在于計(jì)算機(jī)系統(tǒng)中,通常在文本文件最后一行放置文件結(jié)束標(biāo)志。文本文件的編碼基于字符定長,譯碼相對要容易一些;二進(jìn)制文件編碼是變長的,靈活利用率要高,而譯碼要難一些,不同的二進(jìn)制文件譯碼方式是不同的。
從本質(zhì)上來說他們之間沒有什么區(qū)別,因?yàn)樗麄冊谟脖P上都有一種的存放方式--二進(jìn)制,但是如果要對他們有些區(qū)分的話,那可以這樣理解。每個(gè)字符由一個(gè)或多個(gè)字節(jié)組成,每個(gè)字節(jié)都是用的-128—127之間的部分?jǐn)?shù)值來表示的,也就是說,-128——127之間還有一些數(shù)據(jù)沒有對應(yīng)任何字符的任何字節(jié)。如果一個(gè)文件中的每個(gè)字節(jié)的內(nèi)容都是可以表示成字符的數(shù)據(jù),我們就可以稱這個(gè)文件為文本文件,可見,文本文件只是二進(jìn)制文件中的一種特例,為了與文本文件相區(qū)別,人們又把除了文本文件以外的文件稱為二進(jìn)制文件,由于很難嚴(yán)格區(qū)分文本文件和二進(jìn)制文件的概念,所以我們可以簡單地認(rèn)為,如果一個(gè)文件專門用于存儲文本字符的數(shù)據(jù),沒有包含字符以外的其他數(shù)據(jù),我們就稱之為文本文件,除此之外的文件就是二進(jìn)制文件。
使用二進(jìn)制文件的好處
為什么要使用二進(jìn)制文件。原因大概有三個(gè):
第一是二進(jìn)制文件比較節(jié)約空間,這兩者儲存字符型數(shù)據(jù)時(shí)并沒有差別。但是在儲存數(shù)字,特別是實(shí)型數(shù)字時(shí),二進(jìn)制更節(jié)省空間,比如儲存 Real*4 的數(shù)據(jù):3.1415927,文本文件需要 9 個(gè)字節(jié),分別儲存:3 . 1 4 1 5 9 2 7 這 9 個(gè) ASCII 值,而二進(jìn)制文件只需要 4 個(gè)字節(jié)(DB 0F 49 40)
第二個(gè)原因是,內(nèi)存中參加計(jì)算的數(shù)據(jù)都是用二進(jìn)制無格式儲存起來的,因此,使用二進(jìn)制儲存到文件就更快捷。如果儲存為文本文件,則需要一個(gè)轉(zhuǎn)換的過程。在數(shù)據(jù)量很大的時(shí)候,兩者就會有明顯的速度差別了。
第三,就是一些比較精確的數(shù)據(jù),使用二進(jìn)制儲存不會造成有效位的丟失。[1]
二進(jìn)制文件的儲存方式
列舉一個(gè)二進(jìn)制文件如下:
00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54
00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50; ABCDEFGHIGKLMNOP
這里列出的是在 UltraEdit(UE) 里看到的東西。其實(shí)只有紅色部分是文件內(nèi)容。前面的是 UE 加入的行號。后面的是 UE 嘗試解釋為字符型的參考。
這個(gè)文件一共有 32 字節(jié)長。顯示為兩列,每列 16 個(gè)字節(jié)。實(shí)際上,這僅僅是 UE 的顯示而已。真實(shí)的文件并不分行。僅僅知道這個(gè)文件的內(nèi)容,如果我們沒有任何說明的話,是不能看出任何有用信息的。
下面我規(guī)定一下說明:我們認(rèn)為,前 4 個(gè)字節(jié)是一個(gè) 4 字節(jié)的整型數(shù)據(jù)(0F 01 00 00 十六進(jìn)制:10Fh 十進(jìn)制:271)。這 4 個(gè)字節(jié)之后的 4 個(gè)字節(jié)是另一個(gè) 4 字節(jié)的整型數(shù)據(jù)(0F 03 00 00 十六進(jìn)制:30Fh 十進(jìn)制:783)。其后的 4 個(gè)字節(jié)(12 53 21 45 )表示一個(gè) 4 字節(jié)的實(shí)型數(shù)據(jù):2.5811919E+3。再其后的 4 個(gè)字節(jié)(58 62 35 34)表示另一個(gè) 4 字節(jié)的實(shí)行數(shù)據(jù):1.6892716E-7。而只后的 16 個(gè)字節(jié)(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我們認(rèn)為是 16 個(gè)字節(jié)的字符串(ABCDEFGHIGKLMNOP)
實(shí)際上,二進(jìn)制文件只是儲存數(shù)據(jù),并不寫明數(shù)據(jù)類型,比如上面的第 9 字節(jié)到第 16 字節(jié)(12 53 21 45 58 62 35 34),我們剛才認(rèn)為是 2 個(gè) 4 字節(jié)的實(shí)型,其實(shí)也可以認(rèn)為是 8 個(gè)字節(jié)的字符型( S!EXb54)。而后面的 16 個(gè)字節(jié)的字符串(ABCDEFGHIGKLMNOP),我們也可以認(rèn)為是 2 個(gè) 8 字節(jié)的整型,或者 4 個(gè) 4 字節(jié)的整型,甚至 2 個(gè) 8 字節(jié)的實(shí)型,4 個(gè) 4 字節(jié)的實(shí)型,等等等等。
因此,面對一個(gè)二進(jìn)制文件,我們不能準(zhǔn)確地知道它的含義,我們需要他的數(shù)據(jù)儲存方式的說明。這個(gè)說明告訴我們第幾個(gè)字節(jié)到第幾個(gè)字節(jié)是什么類型的數(shù)據(jù),儲存的數(shù)據(jù)是什么含義。否則的話,我們只能猜測,或者無能為力。[1]
如何使用語句操作二進(jìn)制文件
我們將上面的那個(gè)二進(jìn)制文件保存為:TestBin.Bin 來舉例。
讀取和寫入二進(jìn)制其實(shí)是兩個(gè)很類似的操作,了解了其中之一,另一個(gè)也就不難了。
二進(jìn)制文件我們通常使用直接讀取方式,Open 語句可以寫為:
引用:
Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )
上面的 Access 表示直接讀取方式,F(xiàn)orm 表示無格式儲存。比較重要的是 RecL 。我們讀取數(shù)據(jù)時(shí),是用記錄來描述單位的,每一次讀入或?qū)懭胧且粋€(gè)記錄。記錄的長度在 Open 時(shí)就確定下來,以后不能改變。如果需要改變,只能 Close 以后再此 Open。
記錄長度在某些編譯器下表示讀取的 4 字節(jié)長度的倍數(shù),規(guī)定為 4 表示記錄長度為 16 字節(jié)。有些編譯器下就直接表示記錄的字節(jié)數(shù),規(guī)定為 4 則表示記錄長度為 4 字節(jié)。這個(gè)問題需要參考編譯器手冊。在 VF 系列里,這個(gè)值是前面一個(gè)含義??梢酝ㄟ^設(shè)置工程屬性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 來改變,使之成為后一個(gè)含義。在命令行模式下,則使用 /assume:byterecl 這個(gè)編譯選項(xiàng)。
確定 RecL 大小是我們需要做的事情,一般來說,不適合太大,也不適合太小。還需要結(jié)合數(shù)據(jù)儲存方式來考慮。太小的話,我們需要執(zhí)行讀寫的次數(shù)就多,太大的話,我們就不方便操作小范圍的數(shù)據(jù)。
有時(shí)候我們甚至?xí)侄啻蝸碜x取數(shù)據(jù),每一次的 RecL 都不同。對于上面的 TestBin.Bin 文件來說,它比較簡單,我以 16 字節(jié)長度和 8 字節(jié)長度兩種讀取方式來演示,你甚至可以一次 32 個(gè)字節(jié)長度全部讀完。[1]
看了什么是二進(jìn)制文件的人還看了: