文字檔與二進位檔案,C++流(待續)

來源:互聯網
上載者:User

首先,讓我們來回顧下你通常認為不值得一提的ASCII碼錶

ASCII碼一般分為三個部分:

  1. Non printable, system codes between 0 and 31.
  2. Lower ASCII(Standart ASCII), between 32 and 127. This part of the table (as shown below) originates from older, American systems, which worked on 7-bit character tables. Foreign letters, like and were not available then.
  3. Higher ASCII(Extended ASCII), between 128 and 255. This part is programmable, in that you can exchange characters based on language you want to write in. Foreign letters are placed in this part and an example is shown below.

ASCII 碼大致可以分作三部分組成。

第一部分由 00H 到 1FH 共 32 個,一般用來通訊或作為控制之用,有些字元可顯示於螢幕,有些則無法顯示在螢幕上,但能看到其效果(例如換行字元、歸位字元)。如下表:

第二部分是由 20H 到 7FH 共 96 個,這 95 個字元是用來表示阿拉伯數字、英文字母大小寫和底線、括號等符號,都可以顯示在螢幕上。如下表:

Below is the standard ASCII characters.

Dec Char Dec Char Dec Char Dec Char Dec Char Dec Char
33 ! 49 1 65 A 81 Q 97 a 113 q
34 " 50 2 66 B 82 R 98 b 114 r
35 # 51 3 67 C 83 S 99 c 115 s
36 $ 52 4 68 D 84 T 100 d 116 t
37 % 53 5 69 E 85 U 101 e 117 u
38 & 54 6 70 F 86 V 102 f 118 v
39 ' 55 7 71 G 87 W 103 g 119 w
40 ( 56 8 72 H 88 X 104 h 120 x
41 ) 57 9 73 I 89 Y 105 i 121 y
42 * 58 : 74 J 90 Z 106 j 122 z
43 + 59 ; 75 K 91 [ 107 k 123 {
44 , 60 < 76 L 92 \ 108 l 124 |
45 - 61 = 77 M 93 ] 109 m 125 }
46 . 62 > 78 N 94 ^ 110 n 126 ~
47 / 63 ? 79 O 95 _ 111 o 127 _
48 0 64 @ 80 P 96 ` 112 p

第三部分由 80H 到 0FFH 共 128 個字元,一般稱為『擴充字元』,這 128 個擴充字元是由 IBM 制定的,並非標準的 ASCII 碼。這些字元是用來表示框線、音標和其他歐洲非英語系的字母。

 

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

大家都知道電腦的儲存在物理上是二進位的,所以文字檔與二進位檔案的區別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。
簡單來說,文字檔是基於字元編碼的檔案,常見的編碼有ASCII編碼,UNICODE編碼等等。

二進位檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思(這樣一個過程,可以看作是自訂編碼)。
從上面可以看出文字檔基本上是定長編碼的,基於字元嘛,每個字元在具體編碼中是固定的,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"這四個控制符。
文字檔的儲存與其讀取基本上是個逆過程,不再累述。而二進位檔案的存取顯然與文字檔的存取差不多,只是編/解碼方式不同而已,也不再敘述。  

三、文字檔與二進位檔案的優缺點
因為文字檔與二進位檔案的區別僅僅是編碼上不同,所以他們的優缺點就是編碼的優缺點,這個找本編碼的書來看看就比較清楚了。一般認為,文字檔編碼基於字元定長,解碼容易些;二進位檔案編碼是變長的,所以它靈活,儲存利用率要高些,解碼難一些(不同的二進位檔案格式,有不同的解碼方式)。關於空間利用率,想想看,二進位檔案甚至可以用一個位元來代表一個意思(位操作),而文字檔任何一個意思至少是一個字元.
很多書上還認為,文字檔的可讀性要好些,儲存要花費轉換時間(讀寫要編解碼),而二進位檔案可讀性差,儲存不存在轉換時間(讀寫不要編解碼,直接寫值).這裡的可讀性是從軟體使用者角度來說的,因為我們用通用的記事本工具就幾乎可以瀏覽所有文字檔,所以說文字檔可讀性好;而讀寫一個具體的二進位檔案需要一個具體的檔案解碼器,所以說二進位檔案可讀性差,比如讀BMP檔案,必須用讀圖軟體.而這裡的儲存轉換時間應該是從編程的角度來說的,因為有些作業系統如windows需要對斷行符號分行符號進行轉換(將'\n',換成'\r\n',所以檔案讀寫時,作業系統需要一個一個字元的檢查當前字元是不是'\n'或'\r\n').這個在儲存轉換在Linux作業系統中並不需要,當然,當在兩個不同的作業系統上共用檔案時,這種儲存轉換又可能出來(如Linux系統和Windows系統共用文字檔)。

從編程的角度來講,兩種檔案我們對待的方式是一樣,即都是01碼,只是邏輯上對其的解釋不一樣而已

四、C++ 檔案I/0

C++使用標準流作為I/O

<待續..>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.