1. 淺析二進制文件與普通文件的區別
近日,在寫一個遍歷查找目錄文件內容功能時,在使用時功能很正常,確發現了些異常。讀取文件時會將一些二進制文件讀取出來,搜索目標字元串。本文將詳細解析如何正確使用程序區分兩種文件(基於c).
文中所指的二進制文件是指可執行文件,或者圖片等非文本類型文件,即Binary文件。
首先,為了文件的簡單,我們手工生成兩個文件,一個普通文件,一個二進制可執行文件
生成普通文件
生成可執行文件a.out
使用grep 查找hello時,兩個文件輸出為
grep是碰到可執行文件時會輸出Binary file
文本文件是一種計算機文件,它是一種典型的順序文件,其埋禪文件的邏輯結構又屬於流式文件。(來源網路)
本文定義為:文本文件是一種順序存儲了unicode編碼,或者其他編碼字元的文件。因為不僅可以存英文還可以存放一些表情及換行等其他字元。
將依次遍歷文檔,然後與所有的可能的編碼中的字元進行查找比較,如果所有字元都符合在這些編碼字元列表中,則當前文檔即為一個文本文檔。
不過這種方法的效率堪憂,有沒有一種更簡單的方法呢。當然有!
當我們使用十六進制的方式打開兩個文件,就會發現不同了。同時對比了一張圖片的十六進制
圖片
在文本文件的十六進制備液虛編碼同時將 unicode符號也在文本中展示出來了。也可以從文本文件的定義可以得出,非ascii不能作為檢測二進制的方法。
但是通過對比三個文件的十六進制編碼會發仿燃現,可執行文件與圖片中包含 了很多00,即空字元,而文本文件中是不存在的。
所以初步結論是不含有空字元的文件即為二進制文件.
但是我們總不能從文件頭到尾去判斷吧,所以我們查看grep與diff源碼會發現一段宏
所以我們取一段數據長度判斷,如果是包含了空字元就是非文本類型文件,比如取1024個位元組。因為二進制文件一般會有一個文件頭,而文件頭的數據長度大約128個位元組。取1024位元組是盡可能的避免頭中數據寫滿。
當然以上方法只針對於utf-8, asccii ,如果是utf-16或者 utf-32 在數據中也同樣會產生空字元
使用grep中同樣會將其識別為binary file 所以不向下做研究了。
2. 什麼是二進制文件
樓上們這么回答,誰能懂啊?
二進制文件往往區別於「文本文件」「文檔文件」。
我們通常把程序、視頻、圖片等不能直接閱讀的文件理解為二進制文件。
因為有的文件內的內容可以是ASCII碼的,這種文件我們往往直接可以閱讀,叫文本文件。
有的文件(如程序、視頻、圖片、或一些電子書等等),計算機是直接用二進制的0和1記錄的,我們無法直接閱讀。甚至根本無法讀。這種文件叫二進制文件。
3. 二進制文件與文本文件的區別
在定義和存取方式上二進制文件與文本文件存在區別。
1、定義上的區別
文本文件:文本文件是一種計算機文件,它是一種典型的順序文件,其文件的邏輯結構又屬於流式文件。簡單的說,文本文件是基於字元編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。
二進制文件:是基於值編碼的文件,你可以根據具體應用,指定某個值是什麼意思(這樣一個過程,可以看作是自定義編碼)。用戶一般不能直接讀懂它們,只有通過相應的軟體才能將其顯示出來。二進制文件一般是可執行程序、圖形、圖像、聲音等等。
從上面可以看出文本文件與二進制文件的區別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異,文本文件基本上是定長編碼的(也有非定長的編碼如UTF-8)。而二進制文件則可看成是變長編碼,因為是值編碼,多少個比特代表一個值,完全由你決定。
2、存儲方式上的區別
文本工具打開一個文件,首先讀取文件物理上所對應的二進制比特流,然後按照所選擇的解碼方式來解釋這個流,然後將解釋結果顯示出來。
一般來說,你選取的解碼方式會是ASCII碼形式(ASCII碼的一個字元是8個比特),接下來,它8個比特8個比特地來解釋這個文件流。
記事本無論打開什麼文件都按既定的字元編碼工作(如ASCII碼),所以當他打開二進制文件時,出現亂碼也是很必然的一件事情了,解碼和解碼不對應。
文本文件的存儲與其讀取基本上是個逆過程。而二進制文件的存取與文本文件的存取差不多,只是編/解碼方式不同而已。
二進制文件就是把內存中的數據按其在內存中存儲的形式原樣輸出到磁碟中存放,即存放的是數據的原形式。文本文件是把數據的終端形式的二進制數據輸出到磁碟上存放,即存放的是數據的終端形式
(3)文件分為二進制文件擴展閱讀
文本文件和二進制文件的優缺點:
一般認為,文本文件編碼基於字元定長,解碼容易些;二進制文件編碼是變長的,所以它靈活,存儲利用率要高些,解碼難一些(不同的二進制文件格式,有不同的解碼方式)。
關於空間利用率,想想看,二進制文件甚至可以用一個比特來代表一個意思(位操作),而文本文件任何一個意思至少是一個字元.
在windows下,文本文件不一定是以ASCII來存貯的,因為ASCII碼只能表示128的標識,你打開一個txt文檔,然後另存為,有個選項是編碼,可以選擇存貯格式,一般來說UTF-8編碼格式兼容性要好一些.而二進制用的計算機原始語言,不存在兼容性。
存儲方式的區別:
如果存儲的是字元數據,無論採用文本文件還是二進制文件都是沒有任何區別的。
如果存儲的是非字元數據,又要看我們使用的情況來決定:
1、如果是需要頻繁的保存和訪問數據,那麼應該採取二進制文件進行存放,這樣可以節省存儲空間和轉換時間。
2、如果需要頻繁的向終端顯示數據或從終端讀入數據,那麼應該採用文本文件進行存放,這樣可以節省轉換時間。
4. 誰能舉例告訴我什麼是二進制文件比如doc、ppt、txt、exe、rmb,它們都是什麼文件
定義
包含在 ASCII及擴展 ASCII字元中編寫的數據或程序指令的文件。計算機文件基本上分為二種:二進制文件和 ASCII(也稱純文本)文件,圖形文件及文字處理程序等計算機程序都屬於二進制文件。這些文件含有特殊的格式及計算機代碼。ASCII 則是可以用任何文字處理程序閱讀的簡單文本文件。
廣義的二進制文件即指文件,由文件在外部設備的存放形式為二進制而得名。狹義的二進制文件即除文本文件以外的文件。
幾種後綴名都是二進制文件。一般二進制文件用記事本打開是亂碼,除了txt文本文件屬於比較特殊的二進制文件外,其它的需要專門的軟體用對應的解碼格式才能正常打開閱讀
doc Word 文檔,屬於二進制文件。
docx 改進的Word文檔,可以用WinRAR打開
ppt 演示文稿
txt 文本文檔
exe 應用程序,屬於計算機可執行文件
rmvb 視頻文件