分享七 文字檔案和二進位制檔案的區別

2021-09-07 03:07:02 字數 4516 閱讀 6440

從檔案編碼的方式來看,檔案可分為ascii碼檔案和二進位製碼檔案兩種。

ascii檔案也稱為文字檔案,這種檔案在磁碟中存放時每個字元對應乙個位元組,用於存放對應的ascii碼。例如,數5678的儲存形式為:

asc碼:  00110101 00110110 00110111 00111000

↓     ↓    ↓    ↓

十進位製碼: 5     6    7    8 共占用4個位元組。ascii碼檔案可在螢幕上按字元顯示, 例如源程式檔案就是ascii檔案,用dos命令type可顯示檔案的內容。 由於是按字元顯示,因此能讀懂檔案內容。

二進位制檔案是按二進位制的編碼方式來存放檔案的。 例如, 數5678的儲存形式為: 00010110 00101110只佔二個位元組。二進位制檔案雖然也可在螢幕上顯示, 但其內容無法讀懂。c系統在處理這些檔案時,並不區分型別,都看成是字元流,按位元組進行處理。 輸入輸出字元流的開始和結束只由程式控制而不受物理符號(如回車符)的控制。 因此也把這種檔案稱作「流式檔案」。

乙個檔案可以以文字模式或二進位制模式開啟,這兩種的區別是:在文字模式中回車被當成乙個字元'/n',而二進位制模式 認為它是兩個字元0x0d,0x0a;如果在檔案中讀到0x1b,文字模式會認為這是檔案結束符,也就是二進位制模型不會對檔案進行處理,而文字方式會按一 定的方式對資料作相應的轉換。

1. 文字檔案與二進位制檔案的定義

簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ascii編碼,unicode編碼等等。二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思(這樣乙個過程,可以看作是自定義編碼)。

從上面可以看出文字檔案基本上是定長編碼的(也有非定長的編碼如utf-8),基於字元嘛,每個字元在具體編碼中是固定的,ascii碼是8個比 特的編碼,unicode一般佔16個位元。而二進位制檔案可看成是變長編碼的,因為是值編碼嘛,多少個位元代表乙個值,完全由你決定。大家可能對bmp文 件比較熟悉,就拿它舉例子吧,其頭部是較為固定長度的檔案頭資訊,前2位元組用來記錄檔案為bmp格式,接下來的8個位元組用來記錄檔案長度,再接下來的4字 節用來記錄bmp檔案頭的長度。大家可以看出來了吧,其編碼是基於值的(不定長的,2、4、8位元組長的值都有),所以bmp是二進位制檔案。

2. 文字檔案與二進位制檔案的訪問

文字工具開啟乙個檔案的過程是怎樣的呢?拿記事本來說,它首先讀取檔案物理上所對應的二進位制位元流(前面已經說了,儲存都是二進位制的),然後按照 你所選擇的解碼方式來解釋這個流,然後將解釋結果顯示出來。一般來說,你選取的解碼方式會是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"這四個控制符。

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

3. 文字檔案與二進位制檔案的優缺點

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

在windows下,文字檔案不一定是一ascii來存貯的,因為ascii碼只能表示128的標識,你開啟乙個txt文件,然後另存為,有個選項是編碼,可以選擇存貯格式,一般來說utf-8編碼格式相容性要好一些。而二進位製用的計算機原始語言,不存貯相容性。

很多書上還認為,文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼),而二進位制檔案可讀性差,儲存不存在轉換時間(讀寫不要編譯碼,直 接寫值).這裡的可讀性是從軟體使用者角度來說的,因為我們用通用的記事本工具就幾乎可以瀏覽所有文字檔案,所以說文字檔案可讀性好;而讀寫乙個具體的二 進製檔案需要乙個具體的檔案解碼器,所以說二進位制檔案可讀性差,比如讀bmp檔案,必須用讀圖軟體。

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

c的文字讀寫和二進位制讀寫

c的文字方讀寫與二進位制讀寫的差別僅僅體現在回車換行符的處理上。文字方式寫時,每遇到乙個''n''(0ah換行符),它將其換成 ''rn''(0d0ah,回車換行),然後再寫入檔案;當文字讀取時,它每遇到乙個''rn''將其反變化為''n'',然後送到讀緩衝區。正因為文字 方式有''n''--''rn''之間的轉換,其存在轉換耗時。二進位制讀寫時,其不存在任何轉換,直接將寫緩衝區中資料寫入檔案。

總地來說,從程式設計的角度來說,c中文字或二進位制讀寫都是緩衝區與檔案中二進位製流的互動,只是文字讀寫時有回車換行的轉換.所以當寫緩衝區中無換行 符''n''(0ah),文字寫與二進位制寫的結果是一樣的,同理,當檔案中不存在''rn''(0dh0ah)時,文字讀與二進位制讀的結果一樣。

例項c的文字讀寫和二進位制讀寫

c的文字方讀寫與二進位制讀寫的差別僅僅體現在回車換行符的處理上。文字方式寫時,每遇到乙個''n''(0ah換行符),它將其換成''r n''(0d0ah,回車換行),然後再寫入檔案;當文字讀取時,它每遇到乙個''rn''將其反變化為''n'',然後送到讀緩衝區。

二進位制讀寫時,其不存在任何轉換,直接將寫緩衝區中資料寫入檔案。

對於內容為 「ab123rn" (41 62 31 32 33 0d 0a)的檔案,

1pf1 =fopen("f:\1.txt","r");

2// 或者pf1 = fopen("f:\1.txt","rb");

3for(inti=0;i < 6;i++)

7fclose(pf1);//關閉檔案

的結果分別為:41 62 31 32 33 0a 和 41 62 31 32 33 0d

5678的儲存形式為:ascii碼: 00110101 00110110 00110111 00111000 (四個位元組)

5678的儲存形式為:二進位制: 00010110 00101110 (兩個位元組)

二進位制檔案和文字檔案的唯一差異就是前者含有一些非標準輸出的ascii碼。0x01就是非標準輸出的ascii碼,0x61就是標準輸出的ascii碼。

案例:

<?php

// get contents of a file into a string

$filename = "/usr/local/something.txt";

$handle = fopen($filename, "r");

$contents = fread($handle, filesize($filename));

fclose($handle);

?>

binary fread()example

在區分二進位制檔案和文字檔案的系統上(如 windows)開啟檔案時,fopen() 函式的 mode 引數要加上 'b'。

<?php

$filename = "c:\\files\\somepic.gif";

$handle = fopen($filename, "rb");

$contents = fread($handle, filesize($filename));

fclose($handle);

?>

文字模式 二進位制模式 文字檔案 二進位制檔案

這幾個概念很常見但是也容易搞混。前兩者是相反的意思,後兩者是一對。1.文字模式 textmode 和二進位制模式 binarymode 的 區別0.無論你用哪種語言進行程式設計,也無論你用哪個函式進行檔案操作 庫函式也好,直接作業系統api也好 最終的檔案開啟的操作都是由作業系統來進行的,因此各種語...

文字檔案與二進位制檔案

從本質上說所有檔案都是二進位制檔案,文字i o是在二進位制i o基礎上提供的一層抽象,它封裝了字元的編碼和解碼過程。在文字i o中自動進行編碼與解碼。在windows和dos系統中,狹義的文字檔案是指擴充套件名為txt的檔案。實際上,那些沒有規定格式的,由可理解的的ascii以及其它編碼文字組成的檔...

文字檔案與二進位制檔案

維基百科 二進位制檔案一般指包含ascii及擴充套件ascii字元中編寫的資料或程式指令的檔案。廣義的二進位制檔案即為檔案,由檔案在外部儲存裝置的存放方式為二進位制而得名。狹義的二進位制檔案即指除文字檔案以外的檔案。簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ascii編碼,unicode編...