文字檔與二進位檔案區別

來源:互聯網
上載者:User

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

    大家都知道電腦的儲存在物理上是二進位的,所以文字檔與二進位檔案的區別並不是物理上的,而是

邏輯上的。這兩者只是在編碼層次上有差異。

    簡單來說,文字檔是基於字元編碼的檔案,常見的編碼有ASCII編碼,UNICODE編碼等等。二進位檔案是

基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思(這樣一個過程,可以看作是自訂編碼)

。

    從上面可以看出文字檔基本上是定長編碼的(也有非定長的編碼如UTF-8),基於字元嘛,每個字元在具

體編碼中是固定的,ASCII碼是8個位元的編碼,UNICODE一般佔16個位元。而二進位檔案可看成是變長編碼的

,因為是值編碼嘛,多少個位元代表一個值,完全由你決定。大家可能對BMP檔案比較熟悉,就拿它舉例子吧

,其頭部是較為固定長度的檔案頭資訊,前2位元組用來記錄檔案為BMP格式,接下來的8個位元組用來記錄檔案長

度,再接下來的4位元組用來記錄bmp檔案頭的長度。。。大家可以看出來了吧,其編碼是基於值的(不定長的,

2、4、8位元組長的值都有),所以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作業系統中並不需要,當然,當在兩個不同的操

作系統上共用檔案時,這種儲存轉換又可能出來(如Linux系統和Windows系統共用文字檔)。關於這個轉換怎

樣進行,我將在下一篇文章《Linux文字檔與Windows文字檔間的轉換》給出^_^

 四、C的文本讀寫和二進位讀寫

    應該說C的文本讀寫與二進位的讀寫是一個編程層次上的問題,與具體的作業系統有關,所以"用文本方

式讀寫的檔案一定是文字檔,用二進位讀寫的檔案一定是二進位檔案"這類觀點是錯誤的.下面的講述非明

確指出作業系統類型,都暗指windows.

    C的文本方讀寫與二進位讀寫的差別僅僅體現在斷行符號分行符號的處理上.文本方式寫時,每遇到一

個''\n''(0AH分行符號),它將其換成''\r\n''(0D0AH,斷行符號換行),然後再寫入檔案;當文本讀取時,它每遇到

一個''\r\n''將其反變化為''\n'',然後送到讀緩衝區.正因為文本方式有''\n''--''\r\n''之間的轉換,

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

    總地來說,從編程的角度來說,C中文本或二進位讀寫都是緩衝區與檔案中二進位流的互動,只是文本讀

寫時有斷行符號換行的轉換.所以當寫緩衝區中無分行符號''\n''(0AH),文本寫與二進位寫的結果是一樣的,同理

,當檔案中不存在''\r\n''(0DH0AH)時,文本讀與二進位讀的結果一樣.

 

 五、執行個體

C的文本讀寫和二進位讀寫

    應該說C的文本讀寫與二進位的讀寫是一個編程層次上的問題,與具體的作業系統有關,所以"用文本方

式讀寫的檔案一定是文字檔,用二進位讀寫的檔案一定是二進位檔案"這類觀點是錯誤的.下面的講述非明

確指出作業系統類型,都暗指windows.

    C的文本方讀寫與二進位讀寫的差別僅僅體現在斷行符號分行符號的處理上.

文本方式寫時,每遇到一個''\n''(0AH分行符號),它將其換成''\r \n''(0D0AH,斷行符號換行),然後再寫入檔案

;當文本讀取時,它每遇到一個''\r\n''將其反變化為''\n'',然後送到讀緩衝區.

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

對於內容為 “Ab123\r\n" (41 62 31 32 33 0D 0A)的檔案,

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

for(int i=0;i <6;i++){

   fread(&a[i],1,1,pf1);

   printf("%0X ",a[i]);

}

fclose(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碼。)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.