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