文本文件和二進制文件的區別


文本文件:
 
文本文件是一種計算機文件,它是一種典型的順序文件,其文件的邏輯結構又屬於流式文件。
特別的是,文本文件是指以ASCII碼方式(也稱文本方式)存儲的文件,更確切地說,英文、數字等字符存儲的是ASCII碼,而漢字存儲的是機內碼。文本文件中除了存儲文件有效字符信息(包括能用ASCII碼字符表示的回車、換行等信息)外,不能存儲其他任何信息。
 
文本文件是一種由若干行字符構成的 計算機文件。文本文件存在於計算機文件系統中。通常,通過在文本文件最后一行后放置文件結束標志來指明文件的結束。
文本文件是指一種容器,而純文本是指一種內容。文本文件可以包含純文本。
一般來說,計算機文件可以分為兩類:文本文件和 二進制文件。[2]  

格式

ASCII

ASCII標准使得
文件 文件
只含有ASCII字符的文本文件可以在 UnixMacintoshMicrosoft WindowsDOS和其它 操作系統之間自由交互,而其它格式的文件是很難做到這一點的。但是,在這些操作系統中,換行符並不相同,處理非ASCII字符的方式也不一致。

MIME

文本文件在MIME標准中的類型為“text/plain”,此外,它通常還附加編碼的信息。在Mac OS X出現前,當Resource fork指定某一個文件的類型為“TEXT”時,Mac OS就認為這個文件是文本文件。在Windows中,當一個文件的擴展名為“txt”時,系統就認為它是一個文本文件。此外,處於特殊的目的,有些文本文件使用其它的擴展名。例如,計算機的源代碼也是文本文件,它們的后綴是用來指明它的程序語言的。

.txt

.txt是包含極少格式信息的文字文件的擴展名。.txt格式並沒有明確的定義,它通常是指那些能夠被系統 終端或者簡單的 文本編輯器接受的格式。任何能讀取文字的程序都能讀取帶有.txt擴展名的文件,因此,通常認為這種文件是通用的、 跨平台的。
在英文文本文件中,ASCII字符集是最為常見的格式,而且在許多場合,它也是默認的格式。對於帶重音符號的和其它的非ASCII字符,必須選擇一種字符編碼。在很多系統中,字符編碼是由計算機的區域設置決定的。常見的字符編碼包括支持許多歐洲語言的 ISO 8859-1
由於許多編碼只能表達有限的字符,通常它們只能用於表達幾種語言。 Unicode制定了一種試圖能夠表達所有已知語言的標准,Unicode字符集非常大,它囊括了大多數已知的字符集。Unicode有多種字符編碼,其中最常見的是 UTF-8,這種編碼能夠向后兼容ASCII,相同內容的的ASCII文本文件和UTF-8文本文件完全一致。

Windows的.txt文件

微軟的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編碼。

數據存儲

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

與二進制文件比較

定義

計算機的存儲在物理上是二進制的,所以文本文件與二進制文件的區別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。
簡單來說,文本文件是基於字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。二進制文件是基於值編碼的文件,你可以根據具體應用,指定某個值(可以看作是自定義編碼)。
從上面可以看出文本文件基本上是定長編碼的(也有非定長的編碼如UTF-8),基於字符,每個字符在具體編碼中是固定的,ASCII碼是8個比特的編碼,UNICODE一般占16個比特。而二進制文件可看成是變長編碼的,因為是值編碼,多少個比特代表一個值,完全由自己決定。

存取

文本工具打開一個文件,首先讀取文件物理上所對應的二進制比特流,然后按照所選擇的解碼方式來解釋這個流,然后將解釋結果顯示出來。一般來說,你選取的解碼方式會是ASCII碼形式(ASCII碼的一個字符是8個比特),接下來,它8個比特8個比特地來解釋這個文件流。記事本無論打開什么文件都按既定的字符編碼工作(如ASCII碼),所以當他打開二進制文件時,出現亂碼也是很必然的一件事情了,解碼和譯碼不對應。
文本文件的存儲與其讀取基本上是個逆過程。而二進制文件的存取與文本文件的存取差不多,只是編/解碼方式不同而已。

優缺點

因為文本文件與二進制文件的區別僅僅是編碼上不同,所以他們的優缺點就是編碼的優缺點。一般認為,文本文件編碼基於字符定長,譯碼容易;二進制文件編碼是變長的,所以它靈活,存儲利用率要高些,譯碼難一些(不同的二進制文件格式,有不同的譯碼方式)。
在windows下,文本文件不一定是ASCII來存貯的,因為ASCII碼只能表示128的標識,打開一個txt文檔,然后另存為,有個選項是編碼,可以選擇存貯格式,一般來說UTF-8編碼格式兼容性要好一些。而二進制用的計算機原始語言,不存貯兼容性。
 
 
 
二進制文件:
 

定義

廣義的二進制文件即指文件,由文件在 外部設備的存放形式為二進制而得名。狹義的二進制文件即除文本文件以外的文件。文本文件是一種由很多行 字符構成的 計算機文件。文本文件存在於 計算機系統中,通常在文本文件最后一行放置文件結束標志。文本文件的 編碼基於字符定長, 譯碼相對要容易一些;二進制文件 編碼是變長的,靈活利用率要高,而譯碼要難一些,不同的二進制文件譯碼方式是不同的。
從本質上來說他們之間沒有什么區別,因為他們在 硬盤上都有一種的存放方式--二進制,但是如果要對他們有些區分的話,那可以這樣理解。每個 字符由一個或多個 字節組成,每個字節都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些數據沒有對應任何字符的任何字節。如果一個文件中的每個 字節的內容都是可以表示成 字符的數據,我們就可以稱這個文件為文本文件,可見,文本文件只是二進制文件中的一種特例,為了與文本文件相區別,人們又把除了文本文件以外的文件稱為二進制文件,由於很難嚴格區分文本文件和二進制文件的概念,所以我們可以簡單地認為,如果一個文件專門用於存儲文本字符的數據,沒有包含字符以外的其他數據,我們就稱之為文本文件,除此之外的文件就是二進制文件。

使用二進制文件的好處

為什么要使用二進制文件。原因大概有三個:
  第一是二進制文件比較節約空間,這兩者儲存字符型數據時並沒有差別。但是在儲存數字,特別是實型數字時,二進制更節省空間,比如儲存 Real*4 的數據:3.1415927,文本文件需要 9 個字節,分別儲存:3 . 1 4 1 5 9 2 7 這 9 個 ASCII 值,而二進制文件只需要 4 個字節(DB 0F 49 40)
  第二個原因是,內存中參加計算的數據都是用二進制無格式儲存起來的,因此,使用二進制儲存到文件就更快捷。如果儲存為文本文件,則需要一個轉換的過程。在數據量很大的時候,兩者就會有明顯的速度差別了。
  第三,就是一些比較精確的數據,使用二進制儲存不會造成有效位的丟失。[1]  

二進制文件的儲存方式

列舉一個二進制文件如下:
00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54
00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50; ABCDEFGHIGKLMNOP
這里列出的是在 UltraEdit(UE) 里看到的東西。其實只有紅色部分是文件內容。前面的是 UE 加入的行號。后面的是 UE 嘗試解釋為字符型的參考。
  這個文件一共有 32 字節長。顯示為兩列,每列 16 個字節。實際上,這僅僅是 UE 的顯示而已。真實的文件並不分行。僅僅知道這個文件的內容,如果我們沒有任何說明的話,是不能看出任何有用信息的。
  下面我規定一下說明:我們認為,前 4 個字節是一個 4 字節的整型數據(0F 01 00 00 十六進制:10Fh 十進制:271)。這 4 個字節之后的 4 個字節是另一個 4 字節的整型數據(0F 03 00 00 十六進制:30Fh 十進制:783)。其后的 4 個字節(12 53 21 45 )表示一個 4 字節的實型數據:2.5811919E+3。再其后的 4 個字節(58 62 35 34)表示另一個 4 字節的實行數據:1.6892716E-7。而只后的 16 個字節(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我們認為是 16 個字節的字符串(ABCDEFGHIGKLMNOP)
  實際上,二進制文件只是儲存數據,並不寫明數據類型,比如上面的第 9 字節到第 16 字節(12 53 21 45 58 62 35 34),我們剛才認為是 2 個 4 字節的實型,其實也可以認為是 8 個字節的字符型( S!EXb54)。而后面的 16 個字節的字符串(ABCDEFGHIGKLMNOP),我們也可以認為是 2 個 8 字節的整型,或者 4 個 4 字節的整型,甚至 2 個 8 字節的實型,4 個 4 字節的實型,等等等等。
  因此,面對一個二進制文件,我們不能准確地知道它的含義,我們需要他的數據儲存方式的說明。這個說明告訴我們第幾個字節到第幾個字節是什么類型的數據,儲存的數據是什么含義。否則的話,我們只能猜測,或者無能為力。[1]  

如何使用語句操作二進制文件

我們將上面的那個二進制文件保存為:TestBin.Bin 來舉例。
  讀取和寫入二進制其實是兩個很類似的操作,了解了其中之一,另一個也就不難了。
二進制文件我們通常使用直接讀取方式,Open 語句可以寫為:
引用:
Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )
上面的 Access 表示直接讀取方式,Form 表示無格式儲存。比較重要的是 RecL 。我們讀取數據時,是用記錄來描述單位的,每一次讀入或寫入是一個記錄。記錄的長度在 Open 時就確定下來,以后不能改變。如果需要改變,只能 Close 以后再此 Open。
  記錄長度在某些編譯器下表示讀取的 4 字節長度的倍數,規定為 4 表示記錄長度為 16 字節。有些編譯器下就直接表示記錄的字節數,規定為 4 則表示記錄長度為 4 字節。這個問題需要參考編譯器手冊。在 VF 系列里,這個值是前面一個含義。可以通過設置工程屬性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 來改變,使之成為后一個含義。在命令行模式下,則使用 /assume:byterecl 這個編譯選項。
  確定 RecL 大小是我們需要做的事情,一般來說,不適合太大,也不適合太小。還需要結合數據儲存方式來考慮。太小的話,我們需要執行讀寫的次數就多,太大的話,我們就不方便操作小范圍的數據。
  有時候我們甚至會分多次來讀取數據,每一次的 RecL 都不同。對於上面的 TestBin.Bin 文件來說,它比較簡單,我以 16 字節長度和 8 字節長度兩種讀取方式來演示,你甚至可以一次 32 個字節長度全部讀完。[1]  

用例

C++程序語言學習過程中常見名詞,相對於Binary file的是Text file( 純文本文件)。
C++中二進制文件讀寫函數:
fread
fwrite
ifstream.read()
ofstream.write()
文件讀
文件寫

  
等等……
Java中二進制文件讀寫函數:
FileInputStream()
FileOutputStream()
文件輸入流()
文件輸出流()
等等……
 
那么,這個時候我們肯定會問:
 

漢字怎樣轉化為二進制代碼?

 
各數制之間的轉換 

  我們用R表示任何數制的基數,討論各數制之間的轉換。

  1.R進制數轉換為十進制數

  二進制、八進制和十六進制數轉換為等值的十進制數,只要把它們用多項式表示並在十進制下進行計算,所得的結果就是十進制數

  2.十進制數轉換為R進制數

  十進制數轉換為等值的二進制、八進制和十六進制數,需要對整數部分和小數部分分別進行轉換。其整數部分用連續除以基數R取余數的方法來完成,小數部分用連續乘以基數R取整數的方法來實現。

     基數   基數   基數   基數   基數

十進制  10000  1000   100   10    1

二進制   16    8    4    2    1

八進制  4096   512    64   8    1

十六進制 65536  4096   256   16    1

  3.二進制數與八進制數十六進制數的轉換

  二進制數與八進制數的轉換應以"3位二進制數對應1位八進制數"%的原則進行。同理,因為24=16,則二進制數與十六進制數的轉換應以"4位二進制數對應1位十六進制數"的原則進行。

  四、二進制數的運算

  在計算機中,二進制數的運算包括算術運算和邏輯運算。

  1.二進制數的算術運算

  (1)二進制數加法

  加法原則:逢二進一

  (2)二進制數減法

  減法原則:借一當二

  (3)二進制數乘法

  乘法原則:與算術乘法形式相同

  (4)二進制數除法

  除法原則:與算術除法形式相同

  2.二進制數的邏輯運算

  邏輯運算是以二進制數為基礎的,邏輯變量只有兩個,用來表示邏輯"真"和"假"。

  (1)邏輯加法("或"運算)

  運算符號:"+"或"∨"

  運算規則:0+0=0;0+1=1;1+0=1;1+1=1;

  (2)邏輯乘法("與"運算)

  運算符號:"×"或"∧"

  運算規則:0×0=0;0×1=0;1×0=0;1×1=1;

  (3)邏輯"非"運算

  運算符號:"-"%運算規則:A&-*=0時,A=1

  五、數據類型及數據單位

  1.數據的兩種類型

  計算機中的數據可概括分為兩大類:數值型數據字符型數據。所有的非數值型數據都要經過數字化后才能在計算機中存儲和處理。

  2.數據單位

  在計算機中通常使用三個數據單位:位、字節和字。位的概念是:最小的存儲單位,英文名稱是bit,常用小寫b或bit表示。用8位二進制數作為表示字符和數字的基本單元,

  英文名稱是byte,稱為一字節。通常用大"B"表示。

  1B(字節)=8b(位)

  1KB(千字節)=1024B(字節)

  1MB(兆字節)=1024KB(千字節)

  字長:字長也稱為字或計算機字,它是計算機能並行處理的二進制數的位數。

  六、字符編碼與漢字編碼

  1.字符編碼

  目前微型機中普遍采用的字符編碼是ASCII碼。它是用七位二進制數對127個字符進行編碼,其中前32個是一些不可打印的控制符號。

  2.漢字編碼及字模信息

  漢字有兩種編碼:國標碼與機內碼。

  國標碼是"中華人民共和國國家標准信息交換漢字編碼",代號為"GB2312-80"。在國標碼的字符集中,收集了一級漢字3755個,二級漢字3008個,圖形符號682個,共7445個。一個漢字對應一個區位碼,由四位數字組成,前兩位數字為區碼(0~94),后兩位數字為位碼(0~94)。機內碼是指漢字在計算機中的編碼

  漢字的機內碼占兩個字節,分別稱為機內碼的高位與低位。它們與區位碼的關系如下:

  機內碼高位=區碼+A0H

  機內碼低位=位碼+A0H

  漢字字庫是由所有漢字的字模信息構成的。一個漢字字模信息占若干字節,究竟占多少個字節由漢字的字形決定。

  例如,如果用16×16點陣表示一個漢字,則一個漢字占16行,每行有16個點,在存儲時用兩個字節存放一行上16個點的信息,對應位為"0"表示該點為"白","1"表示該點為"黑"。因此,一個16×16點陣的漢字占32個字節。

---------------------------------------------------------------

描述2進制的數據結構,用字符串直觀,但是效率低,用數組效率高,但是不直觀。
但是道理相同。

性字轉換后的結果:
010000010000 010010010000 010010010100 111011111110 110010010000 010100010000 010011111110 010000010000 010000010000 010000010000 010111111110 000000000000

144位編碼,這也不可能的,

性字編碼alert asc("性")得到-12076,轉化為2進制為-10111100101100 不算正負有14位就夠了。
如果非要補到144位也因該是高位補0。

function c10to2(x)
'10進制到2進制的轉換
dim sign, result
result = ""
'符號
sign = sgn(x)
x = abs(x)

if x = 0 then
c10to2 = 0
exit function
end if
do until x = "0"
result = result & (x mod 2)
x = x \ 2
loop
result = strReverse(result)

if sign = -1 then
c10to2 = "-" & result
else
c10to2 = result
end if
end function

---------------------------------------------------------------

另外一個人的寫法:

function c10to2(x)
mysign=sgn(x)
x=abs(x)
DigS=1

do
if x<2^DigS








二進制編碼轉漢字:

1. 漢字信息交換碼(國標碼)
  《信息交換用漢字 編碼字符集·基本集》是我國於1980年制定的國家標准 GB2312-80,代號為國標碼,是國家規定的用於漢字信息處理使用的代碼依據。
   GB2312-80中規定了信息交換用的6763個漢字和682個非漢字圖形符號(包括幾種外文字母、數字和符號)的代碼。
  6763個漢字又按其 使用頻度、組詞能力以及用途大小分成一級常用漢字3755個和二級常用漢字3008個。
  一級漢字按拼音字母順序排列;若遇同音字,則 按起筆的筆形順序排列;若起筆相同,則按第二筆的筆形順序排列,依次類推。所謂筆形順序,就是橫、豎、撇、點和折的順序。二級漢字按 部首順序排列。
  在此標准中,每個漢字(圖形符號)采用雙字節表示。每個字節只用低7位,最高位恆為1。由於低7位中有34種狀態是用 於控制字符,因此,只有94(128-34=94)種狀態可用於漢字編碼。這樣,雙字節的低7位只能表示94×94=8836種狀態。

 

編碼范圍

 

二進制數碼

 

十進制數碼

 

 

基本 ASCII 碼    
00000000~01111111    
0~127    

 

控制字符    
00000000~00100000、01111111    
0~32、127    

 

可用漢字段    
00100001~01111110    
33~126 (1~94)    

 

擴充 ASCII 碼    
10000000~11111111    
128~255    

 

控制字符    
10000000~10100000、11111111    
128~160、255    

 

GB2312-80    
10100001~11111110    
161~254 (1~94)    

  此標准的漢字編碼表有94行、94列,其行號稱為區號,列號稱為位號。雙字節中,用 高字節表示區號,低字節表示位號。非漢字圖形符號置於第1~11區,一級漢字3755個且於第16~55區,二級漢字3008個置於第56~87區。
  每個圖形字符的漢字交換碼,均用兩個字節的低7位二進制碼表示。漢字國標碼通常用十六進制數表示。
  例如:“中”字的區號為 54,位號為48,計算它的二進制數和十六進制數國標碼。
    解:先將區、位號分別加上 32 :
      54+32=86
       48+32=80
    分別轉換為二進制數:
      (86)10=01010110
      (80)10=0 1010000
  得到二進制數國標碼為:
      01010110 01010000。
  最后通過 8 4 2 1 ── 二進制取位法轉換成十六 進制漢字國標碼為:5650。
  又如“國”字的區號為25,位號為90,用以上相同的方法得到它的國標碼為:
  二進制:00111001 01111010
  十六進制:397A

----------------------------------------------------------------

基於以上原則,則

  11000100,11100011,10111010,11000011

>(1100 0100 1110 0011)2,(1011 1010 1100 0011)2

>(C4E3)16,(BAC3)16

>查表可知:C4E3>>‘你’,BAC3>>‘好’


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM