漫談ASCII碼文件和二進制文件

我們在linux操作系統中用得最多的要屬於是對文件的操作,只要我們一進入該操作系統面向的都是對文件的操作。上次在博客中提到了linux的文件系統與windows文件系統及linux下的七種文件類型。其中對文件的分類是基於文件的基本屬性,現在從文件的編碼方式角度來對文件進行分類可以分爲:ASCII碼文件(也稱文本文件)和二進制文件。

由於兩種文件的數據在計算機中都是以二進制的形式存儲的,故對於ASCII碼文件和二進制文件的區別不是在物理上,而是在邏輯組成上。不同的邏輯組成可以形成不同的存儲內容。

ASCII碼文件是一個模糊的概念,但絕大部分認爲ASCII文件是用來保存字符的。文件中的字節數都是字符的某種編碼形式(如:ASCII碼 / UTF - 8碼);在linux終端可以用命令cat查看其中的字符內容,用vim編輯器可以編輯其中的的字符,如我們用vi編輯的所有源文件都是ASCII碼文件。

二進制文件不是用來保存字符的,文件的字節數表示其他的含義(可執行文件中有些字節表示指令,有些字節表示各SectionSegment在文件中的位置,有些字節表示各Segment的加載地址)。如,目標文件、可執行文件、庫文件;hexdump命令查看一個二進制文件。

現在我做一個小實驗,以區別二進制文件和文本文件:

這裏爲了能和windows操作系統做對比,我現在windows環境下編輯了個text.txt文件(即爲ASCII文件),然後輸入"12345回車":

215845684.png

我將此文件移到linux操作系統下藉助od命令查看文件的存儲形式:

220222907.png

然後用cat命令來顯示text.txt文本的內容:

220337974.png

看到這裏我們很容易理解windows對文本文件(ASCII碼文件)的回車處理很特別:

文件輸入\n,它將其轉成 \r\n,輸出的時候將\r\n 轉成\n


在來看看在linux下直接用VIM編輯相同的文件:

220924571.png

接着再用相同的命令來查看,先看看它的存儲方式:

221149706.png

在linux下系統自動爲ASCII碼文件添加'\n',佔7個字節;

再看看它文件本身所顯示的內容:

221447715.png

內容照我在vim下編輯的內容顯示。



下面再看看對二進制文件的處理:

我在windows下試圖打開一個二進制文件,但最終失敗!但可以預測到打開的文件絕大部分是0、1序列或者是亂碼,在linux下我打開了一個二進制文件:

222328147.png

亂碼序列顯示。

後來我在網上查到,windows操作系統不對二進制文件進行轉化;linux不區分ASCII碼文件和二進制文件。


既然談到二進制文件和ASCII文件,那麼也應該知道點他們的應用吧。下面我將簡單的介紹下這兩種類型的文件在傳輸方面的應用:

ASCII傳輸模式和二進制數據傳輸模式是FTP的傳輸的兩種方式。

 1.ASCII傳輸方式:假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便於把文件解釋成另外那臺計算機存儲文本文件的格式。
但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,數據庫,字處理文件或者壓縮文件(儘管字處理文件包含的大部分是文本,其中也包含有指示頁尺寸,字庫等信息的非打印字符)。在拷貝任何非文本文件之前,用binary 命令告訴ftp逐字拷貝,不要對這些文件進行處理,這也是下面要講的二進制傳輸。
  2.二進制傳輸模式:在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如,macintosh以二進制方式傳送可執行文件到Windows系統,在對方系統上,此文件不能執行。
  如果你在ASCII方式下傳輸二進制文件,即使不需要也仍會轉譯。這會使傳輸稍微變慢 ,也會損壞數據,使文件變得不能用。(在大多數計算機上,ASCII方式一般假設每一字符的第一有效位無意義,因爲ASCII字符組合不使用它。如果你傳輸二進制文件,所有的位都是重要的。)如果你知道這兩臺機器是同樣的,則二進制方式對文本文件和數據文件都是有效的。
   FTP的工作方式
  FTP支持兩種模式,一種方式叫做Standard (也就是 PORT方式,主動方式),一種是 Passive (也就是PASV,被動方式)。 Standard模式 FTP的客戶端發送 PORT 命令到FTP服務器。Passive模式FTP的客戶端發送 PASV命令到 FTP Server。
  下面介紹一個這兩種方式的工作原理:
  Port模式FTP 客戶端首先和FTP服務器的TCP 21端口建立連接,通過這個通道發送命令,客戶端需要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什麼端口接收數據。在傳送數據的時候,服務器端通過自己的TCP 20端口連接至客戶端的指定端口發送數據。 FTP server必須和客戶端建立一個新的連接用來傳送數據。
  Passive模式在建立控制通道的時候和Standard模式類似,但建立連接後發送的不是Port命令,而是Pasv命令。FTP服務器收到Pasv命令後,隨機打開一個高端端口(端口號大於1024)並且通知客戶端在這個端口上傳送數據的請求,客戶端連接FTP服務器此端口,然後FTP服務器將通過這個端口進行數據的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連接。
  很多防火牆在設置的時候都是不允許接受外部發起的連接的,所以許多位於防火牆後或內網的FTP服務器不支持PASV模式,因爲客戶端無法穿過防火牆打開FTP服務器的高端端口;而許多內網的客戶端不能用PORT模式登陸FTP服務器,因爲從服務器的TCP 20無法和內部網絡的客戶端建立一個新的連接,造成無法工作。

看到這裏相信大家對ASCII文件與二進制文件有了個深入的瞭解吧!^-^


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章