1. 程式人生 > >文字檔案和二進位制檔案的差異和區別

文字檔案和二進位制檔案的差異和區別

轉自:https://blog.csdn.net/colourful_sky/article/details/80334250

廣義上的二進位制檔案包括文字檔案,這裡討論的是狹義上的二進位制檔案與文字檔案的比較:

  1. 能儲存的資料型別不同
    文字檔案只能儲存char型字元變數。二進位制檔案可以儲存char/int/short/long/float/……各種變數值。
  2. 每條資料的長度
    文字檔案每條資料通常是固定長度的。以ASCII為例,每條資料(每個字元)都是1個位元組。進位制檔案每條資料不固定。如short佔兩個位元組,int佔四個位元組,float佔8個位元組……
  3. 讀取的軟體不同
    文字檔案編輯器就可以讀寫。比如記事本、NotePad++、Vim等。二進位制檔案需要特別的解碼器。比如bmp檔案需要影象檢視器,rmvb需要播放器……
  4. 作業系統對換行符(‘\n’)的處理不同(不重要)
    文字檔案,作業系統會對’\n’進行一些隱式變換,因此文字檔案直接跨平臺使用會出問題。
    在Windows下,寫入’\n’時,作業系統會隱式的將’\n’轉換為”\r\n”,再寫入到檔案中;讀的時候,會把“\r\n”隱式轉化為’\n’,再讀到變數中。
    在Linux下,寫入’\n’時,作業系統不做隱式變換。
    二進位制檔案,作業系統不會對’\n’進行隱式變換,很多二進位制檔案(如電影、圖片等)可以跨平臺使用。

從儲存方式來說,檔案在磁碟上的儲存方式都是二進位制形式,所以,文字檔案其實也應該算二進位制檔案。先從他們的區別來說,雖然都是二進位制檔案,但是二進位制代表的意思不一樣。打個比方,一個人,我們可以叫他的大名,可以叫他的小名,但其實都是代表這個人。二進位制讀寫是將記憶體裡面的資料直接讀寫入文字中,而文字呢,則是將資料先轉換成了字串,再寫入到文字中。

要弄明白二者的區別,需要知道檔案的讀寫過程。以讀檔案為例,

實際上是磁碟 》》 檔案緩衝區》》應用程式記憶體空間這兩個轉化過程。我們說“文字檔案和二進位制檔案沒有區別”,實際上針對的是第一個過程;既然沒有區別,那麼開啟方式不同,為何顯示內容就不同呢?這個區別實際上是第二個過程造成的。

檔案實際上包括兩部分,控制資訊和內容資訊。純文字檔案僅僅是沒有控制格式資訊罷了;

實際上也是一種特殊的二進位制檔案。所以,我們很難區分二者的不同,因為他們的概念上不是完全互斥的。我們說文字檔案是特殊的二進位制檔案,是因為文字檔案實際上的解釋格式已經確定了:ASCII或者unicode編碼。文字檔案的一個缺點是,它的熵往往較低,也就是說,其實本可以用更小的儲存空間記錄這些資訊。比如,文字檔案中的一個數字65536,需要用5個位元組來儲存;但是用二進位制格式,採用int儲存,僅僅需要2個位元組。而二進位制檔案elf和bmp等,都往往有一個head,告訴你檔案資訊和解釋方式。

記事本支援文字檔案而不支援二進位制檔案,所以如果你用記事本開啟文字檔案那麼一切正常,如果開啟的是二進位制檔案就會出現亂碼。但也有不亂碼的地方,你會注意到那些地方都是字元編碼的,而對於int、double等型別所對應的值都是亂碼的,這是由於記事本只能夠識別字符型別,而無法識別其他型別。

1、二進位制檔案是把記憶體中的資料按其在記憶體中的儲存形式原樣輸出到磁碟上存放,也就是說存放的是資料的原形式。

2、文字檔案是把資料的終端形式的二進位制資料輸出到磁碟上存放,也就是說存放的是資料的終端形式。

字元資料本身在記憶體中就經過了編碼,所以無論是二進位制還是文字形式都是一樣的,而對於非字元資料來說,例如inti=10;如果用二進位制來進行儲存的話為1010,但是如果需要用文字形式來進行儲存的話就必須進行格式化編碼(對1和0分別編碼,即形式為‘1’和‘0’分別對應的碼值)。


一、文字檔案與二進位制檔案的定義

大家都知道計算機的儲存在物理上是二進位制的,所以文字檔案與二進位制檔案的區別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ASCII編碼,UNICODE編碼等等。二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思(這樣一個過程,可以看作是自定義編碼。

從上面可以看出文字檔案基本上是定長編碼的(也有非定長的編碼如UTF-8)。而二進位制檔案可看成是變長編碼的,因為是值編碼嘛,多少個位元代表一個值,完全由你決定。大家可能對BMP檔案比較熟悉,就拿它舉例子吧,其頭部是較為固定長度的檔案頭資訊,前2位元組用來記錄檔案為BMP格式,接下來的8個位元組用來記錄檔案長度,再接下來的4位元組用來記錄bmp檔案頭的長度。

二、文字檔案與二進位制檔案的存取

文字工具開啟一個檔案的過程是怎樣的呢?拿記事本來說,它首先讀取檔案物理上所對應的二進位制位元流,然後按照你所選擇的解碼方式來解釋這個流,然後將解釋結果顯示出來。一般來說,你選取的解碼方式會是ASCII碼形式(ASCII碼的一個字元是8個位元),接下來,它8個位元8個位元地來解釋這個檔案流。例如對於這麼一個檔案流”01000000_01000001_01000010_01000011”(下劃線”_”,為了增強可讀性手動新增的),第一個8位元”01000000”按ASCII碼來解碼的話,所對應的字元是字元”A”,同理其它3個8位元可分別解碼為”BCD”,即這個檔案流可解釋成“ABCD”,然後記事本就將這個“ABCD”顯示在螢幕上。

事實上,世界上任何東西要與其他東西通訊會話,都存在一個既定的協議,既定的編碼。人與人之間通過文字聯絡,漢字“媽”代表生你的那個人,這就是一種既定的編碼。但注意到這樣一種情況,漢字“媽”在日本文字裡有可能是你生下的那個人,所以當一箇中國人A與日本B之間用“媽”這個字進行交流,出現誤解就很正常的。用記事本開啟二進位制檔案與上面的情況類似。記事本無論開啟什麼檔案都按既定的字元編碼工作(如ASCII碼),所以當他開啟二進位制檔案時,出現亂碼也是很必然的一件事情了,解碼和譯碼不對應嘛。例如檔案流”00000000_00000000_00000000_00000001”可能在二進位制檔案中對應的是一個四位元組的整數int 1,在記事本里解釋就變成了”NULL_NULL_NULL_SOH”這四個控制符。

文字檔案的儲存與其讀取基本上是個逆過程。而二進位制檔案的存取顯然與文字檔案的存取差不多,只是編/解碼方式不同而已。

三、文字檔案與二進位制檔案的優缺點

因為文字檔案與二進位制檔案的區別僅僅是編碼上不同,所以他們的優缺點就是編碼的優缺點,這個找本編碼的書來看看就比較清楚了。一般認為,文字檔案編碼基於字元定長,譯碼容易些;二進位制檔案編碼是變長的,所以它靈活,儲存利用率要高些,譯碼難一些(不同的二進位制檔案格式,有不同的譯碼方式)。關於空間利用率,想想看,二進位制檔案甚至可以用一個位元來代表一個意思(位操作),而文字檔案任何一個意思至少是一個字元。

在windows下,文字檔案不一定是一ASCII來存貯的,因為ASCII碼只能表示128的標識,你開啟一個txt文件,然後另存為,有個選項是編碼,可以選擇存貯格式,一般來說UTF-8編碼格式相容性要好一些.而二進位制用的計算機原始語言,不存貯相容性. 很多書上還認為,文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼),而二進位制檔案可讀性差,儲存不存在轉換時間(讀寫不要編解碼,直接寫值).這裡的可讀性是從軟體使用者角度來說的,因為我們用通用的記事本工具就幾乎可以瀏覽所有文字檔案,所以說文字檔案可讀性好;而讀寫一個具體的二進位制檔案需要一個具體的檔案解碼器,所以說二進位制檔案可讀性差,比如讀BMP檔案,必須用讀圖軟體。

而這裡的儲存轉換時間應該是從程式設計的角度來說的,因為有些作業系統如windows需要對回車換行符進行轉換(將”\n”,換成”\r\n”,所以檔案讀寫時,作業系統需要一個一個字元的檢查當前字元是不是”\n”或”\r\n”).這個在儲存轉換在Linux作業系統中並不需要,當然,當在兩個不同的作業系統上共享檔案時,這種儲存轉換又可能出來。


文字檔案是一種計算機檔案,它是一種典型的順序檔案,其檔案的邏輯結構又屬於流式檔案。

特別的是,文字檔案是指以ASCII碼方式(也稱文字方式)儲存的檔案,更確切地說,英文、數字等字元儲存的是ASCII碼,而漢字儲存的是機內碼。文字檔案中除了儲存檔案有效字元資訊(包括能用ASCII碼字元表示的回車、換行等資訊)外,不能儲存其他任何資訊。

文字檔案是一種由若干行字元構成的計算機檔案。文字檔案存在於計算機檔案系統中。通常,通過在文字檔案最後一行後放置檔案結束標誌來指明檔案的結束。文字檔案是指一種容器,而純文字是指一種內容。文字檔案可以包含純文字。一般來說,計算機檔案可以分為兩類:文字檔案和二進位制檔案。

只含有ASCII字元的文字檔案可以在Unix、Macintosh、Microsoft Windows、DOS和其它作業系統之間自由互動,而其它格式的檔案是很難做到這一點的。但是,在這些作業系統中,換行符並不相同,處理非ASCII字元的方式也不一致。

.txt是包含極少格式資訊的文字檔案的副檔名。.txt格式並沒有明確的定義,它通常是指那些能夠被系統終端或者簡單的文字編輯器接受的格式。任何能讀取文字的程式都能讀取帶有.txt副檔名的檔案,因此,通常認為這種檔案是通用的、跨平臺的。

在英文文字檔案中,ASCII字符集是最為常見的格式,而且在許多場合,它也是預設的格式。對於帶重音符號的和其它的非ASCII字元,必須選擇一種字元編碼。在很多系統中,字元編碼是由計算機的區域設定決定的。常見的字元編碼包括支援許多歐洲語言的ISO 8859-1。

由於許多編碼只能表達有限的字元,通常它們只能用於表達幾種語言。Unicode制定了一種試圖能夠表達所有已知語言的標準,Unicode字符集非常大,它囊括了大多數已知的字符集。Unicode有多種字元編碼,其中最常見的是UTF-8,這種編碼能夠向後相容ASCII,相同內容的的ASCII文字檔案和UTF-8文字檔案完全一致。

微軟的MS-DOS和Windows採用了相同的文字檔案格式,它們都使用CR和LF兩個字元作為換行符,這兩個字元對應的ASCII碼分別為13和10。通常,最後一行文字並不以換行符(CR-LF標誌)結尾,包括記事本在內的很多文字編輯器也不在檔案的最後新增換行符。

大多數Windows文字檔案使用ANSI、OEM或者Unicode編碼。Windows所指的ANSI編碼通常是1位元組的ISO-8859編碼,不過對於像中文、日文、朝鮮文這樣的環境,需要使用2位元組字符集。在過渡至Unicode前,Windows一直用ANSI作為系統預設的編碼。而OEM編碼,也是通常所說的MS-DOS內碼表,是IBM為早期IBM個人電腦的文字模式顯示系統定義的。在全屏的MS-DOS程式中同時使用了圖形的和按行繪製的字元。新版本的Windows可以使用UTF-16LE和UTF-8之類的Unicode編碼。

由於結構簡單,文字檔案被廣泛用於記錄資訊。它能夠避免其它檔案格式遇到的一些問題。此外,當文字檔案中的部分資訊出現錯誤時,往往能夠比較容易的從錯誤中恢復出來,並繼續處理其餘的內容。文字檔案的一個缺點是,它的熵往往較低,也就是說,可以用較小的儲存空間記錄這些資訊。

文字檔案基本上是定長編碼的(也有非定長的編碼如UTF-8),基於字元,每個字元在具體編碼中是固定的,ASCII碼是8個位元的編碼,UNICODE一般佔16個位元。而二進位制檔案可看成是變長編碼的,因為是值編碼,多少個位元代表一個值,完全由自己決定。

廣義的二進位制檔案即指檔案,由檔案在外部裝置的存放形式為二進位制而得名。狹義的二進位制檔案即除文字檔案以外的檔案。

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

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

第一是二進位制檔案比較節約空間,這兩者儲存字元型資料時並沒有差別。但是在儲存數字,特別是實型數字時,二進位制更節省空間;第二個原因是,記憶體中參加計算的資料都是用二進位制無格式儲存起來的,因此,使用二進位制儲存到檔案就更快捷。如果儲存為文字檔案,則需要一個轉換的過程。在資料量很大的時候,兩者就會有明顯的速度差別了。第三,就是一些比較精確的資料,使用二進位制儲存不會造成有效位的丟失。