什麼是二進位制檔案二進位制檔案的儲存方式

  二進位制檔案格式是系統軟體開發、病毒或木馬原始碼分析以及檔案壓縮工作的基礎。什麼是二進位制檔案呢?下面是小編整理的什麼是二進位制檔案,歡迎閱讀。

  什麼是二進位制檔案

  包含在 ASCII及擴充套件 ASCII 字元中編寫的資料或程式指令的檔案。計算機檔案基本上分為二種:二進位制檔案和 ASCII***也稱純文字檔案***,圖形檔案及文書處理程式等計算機程式都屬於二進位制檔案。這些檔案含有特殊的格式及計算機程式碼。ASCII 則是可以用任何文書處理程式閱讀的簡單文字檔案。

  二進位制檔案定義

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

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

  使用二進位制檔案的好處

  為什麼要使用二進位制檔案。原因大概有三個:

  第一是二進位制檔案比較節約空間,這兩者儲存字元型資料時並沒有差別。但是在儲存數字,特別是實型數字時,二進位制更節省空間,比如儲存 Real*4 的資料:3.1415927,文字檔案需要 9 個位元組,分別儲存:3 . 1 4 1 5 9 2 7 這 9 個 ASCII 值,而二進位制檔案只需要 4 個位元組***DB 0F 49 40***

  第二個原因是,記憶體中參加計算的資料都是用二進位制無格式儲存起來的,因此,使用二進位制儲存到檔案就更快捷。如果儲存為文字檔案,則需要一個轉換的過程。在資料量很大的時候,兩者就會有明顯的速度差別了。

  第三,就是一些比較精確的資料,使用二進位制儲存不會造成有效位的丟失。[1]

  二進位制檔案的儲存方式

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

  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 位元組的實型,等等等等。

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

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

  我們將上面的那個二進位制檔案儲存為: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 來改變,使之成為後一個含義。在命令列模式下,則使用 / 這個編譯選項。

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

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