二進制文件
二進制文件 |
中文名: 二進制文件 外文名: BINary files 外國語縮寫: BIN(作文件擴展名) |
包含在 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++中二進制文件讀寫函數:
等等……
爪哇(Java)中二進制文件讀寫函數:
等等……