二進制檔案

二進制檔案

二進制檔案是指包含在 ASCII及擴展 ASCII 字元中編寫的數據或程式指令的檔案。計算機檔案基本上分為二種:二進制檔案和 ASCII(也稱純文本檔案),圖形檔案及文字處理程式等電腦程式都屬於二進制檔案,這些檔案含有特殊的格式及計算機代碼。ASCII 則是可以用任何文字處理程式閱讀的簡單文本檔案。簡單的說,如果一個檔案專門用於存儲文本字元的數據,沒有包含字元以外的其他數據,我們就稱之為文本檔案,除此之外的檔案就是二進制檔案。

基本定義

廣義的二進制檔案即指檔案,由檔案在外部設備的存放形式為二進制而得名。狹義的二進制檔案即除文本檔案以外的檔案。文本檔案是一種由很多行字元構成的計算機檔案。文本檔案存在於計算機系統中,通常在文本檔案最後一行放置檔案結束標誌。文本檔案的編碼基於字元定長,解碼相對要容易一些;二進制檔案編碼是變長的,靈活利用率要高,而解碼要難一些,不同的二進制檔案解碼方式是不同的。

從本質上來說他們之間沒有什麼區別,因為他們在硬碟上都有一種的存放方式--二進制,但是如果要對他們有些區分的話,那可以這樣理解。每個字元由一個或多個位元組組成,每個位元組都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些數據沒有對應任何字元的任何位元組。如果一個檔案中的每個位元組的內容都是可以表示成字元的數據,我們就可以稱這個檔案為文本檔案,可見,文本檔案只是二進制檔案中的一種特例,為了與文本檔案相區別,人們又把除了文本檔案以外的檔案稱為二進制檔案,由於很難嚴格區分文本檔案和二進制檔案的概念,所以我們可以簡單地認為,如果一個檔案專門用於存儲文本字元的數據,沒有包含字元以外的其他數據,我們就稱之為文本檔案,除此之外的檔案就是二進制檔案。

二進制檔案的儲存方式

列舉一個二進制檔案如下:

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) 里看到的東西。其實只有紅色部分是檔案內容。前面的是 UE 加入的行號。後面的是 UE 嘗試解釋為字元型的參考。

這個檔案一共有 32 位元組長。顯示為兩列,每列 16 個位元組。實際上,這僅僅是 UE 的顯示而已。真實的檔案並不分行。僅僅知道這個檔案的內容,如果我們沒有任何說明的話,是不能看出任何有用信息的。

下面我規定一下說明:我們認為,前 4 個位元組是一個 4 位元組的整型數據(0F 01 00 00 十六進制:10Fh 十進制:271)。這 4 個位元組之後的 4 個位元組是另一個 4 位元組的整型數據(0F 03 00 00 十六進制:30Fh 十進制:783)。其後的 4 個位元組(12 53 21 45 )表示一個 4 位元組的實型數據:2.5811919E+3。再其後的 4 個位元組(58 62 35 34)表示另一個 4 位元組的實行數據:1.6892716E-7。而只後的 16 個位元組(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我們認為是 16 個位元組的字元串(ABCDEFGHIGKLMNOP)

實際上,二進制檔案只是儲存數據,並不寫明數據類型,比如上面的第 9 位元組到第 16 位元組(12 53 21 45 58 62 35 34),我們剛才認為是 2 個 4 位元組的實型,其實也可以認為是 8 個位元組的字元型( S!EXb54)。而後面的 16 個位元組的字元串(ABCDEFGHIGKLMNOP),我們也可以認為是 2 個 8 位元組的整型,或者 4 個 4 位元組的整型,甚至 2 個 8 位元組的實型,4 個 4 位元組的實型,等等等等。

因此,面對一個二進制檔案,我們不能準確地知道它的含義,我們需要他的數據儲存方式的說明。這個說明告訴我們第幾個位元組到第幾個位元組是什麼類型的數據,儲存的數據是什麼含義。否則的話,我們只能猜測,或者無能為力。

如何使用語句操作二進制檔案

我們將上面的那個二進制檔案保存為:TestBin.Bin 來舉例。

讀取和寫入二進制其實是兩個很類似的操作,了解了其中之一,另一個也就不難了。

二進制檔案我們通常使用直接讀取方式,Open 語句可以寫為:

引用:

Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )

上面的 Access 表示直接讀取方式,Form 表示無格式儲存。比較重要的是 RecL 。我們讀取數據時,是用記錄來描述單位的,每一次讀入或寫入是一個記錄。記錄的長度在 Open 時就確定下來,以後不能改變。如果需要改變,只能 Close 以後再此 Open。

記錄長度在某些編譯器下表示讀取的 4 位元組長度的倍數,規定為 4 表示記錄長度為 16 位元組。有些編譯器下就直接表示記錄的位元組數,規定為 4 則表示記錄長度為 4 位元組。這個問題需要參考編譯器手冊。在 VF 系列裡,這個值是前面一個含義。可以通過設定工程屬性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 來改變,使之成為後一個含義。在命令行模式下,則使用 /assume:byterecl 這個編譯選項。

確定 RecL 大小是我們需要做的事情,一般來說,不適合太大,也不適合太小。還需要結合數據儲存方式來考慮。太小的話,我們需要執行讀寫的次數就多,太大的話,我們就不方便操作小範圍的數據。

有時候我們甚至會分多次來讀取數據,每一次的 RecL 都不同。對於上面的 TestBin.Bin 檔案來說,它比較簡單,我以 16 位元組長度和 8 位元組長度兩種讀取方式來演示,你甚至可以一次 32 個位元組長度全部讀完。

用例

C++程式語言學習過程中常見名詞,相對於Binary file的是Text file(純文本檔案)。

C++中二進制檔案讀寫函式:

fread fwrite ifstream.read() ofstream.write()
檔案讀 檔案寫

等等……

爪哇(Java)中二進制檔案讀寫函式:

FileInputStream() FileOutputStream()
檔案輸入流() 檔案輸出流()

等等……

相關詞條

相關搜尋

熱門詞條

聯絡我們