1. 程式人生 > >二進位制檔案和ASCII檔案有何區別

二進位制檔案和ASCII檔案有何區別

二進位制檔案和ASCII檔案(即文字檔案)的區別,對於和計算機親近時間尚短的同學是個難題。本文用簡單的例子,試圖展示其中的道道,希望能對菜鳥們有些幫助。

1、一個例子:兩種100000

  有程式:
#include<iostream>
using namespace std;
int main( )
{
   char c[8]="100000";
   int n=100000;
   cout<<"c="<<c<<endl;
   cout<<"n="<<n<<endl;
   return 0;
}
  執行結果:
  c=100000
  n=100000

  c和n的輸出看起來是一樣的,那兩者真的一樣嗎?

  顯然不是一回事。
  有圖為證。下面是在CodeBlock中單步執行上面的程式時,跟蹤c和n的值看到的情形。
  
  (注:要將待觀察的資料以二進位制形式顯示出來,方法見本文附註部分。)
  
  字串的c佔用了8個位元組,儲存的是:1個'1'(ASCII碼為49,二進位制110001)、5個'0'(ASCII碼為48,二進位制110000),最後2個位元組為'\0'(ASCII碼為0)
  而整型的n,用4個位元組(可以將圖中二進位制1 1000 0110 1010 0000轉成十進位制,正好100000。本來4位元組32位,前面的0省略了。)
  重點品味一下n。n在記憶體中用4位元組表示,那樣一種形式,對掌握計算機內部機制的人不是回事,但對和計算機尚做不到十分親近的人而言,32位的資料就是#@!#

[email protected]#...。當程式中用cout<<n的方式顯示n值時,給出的是100000。可敬的cout!
  實際上,cout輸出過程中,計算機已經給我們做了轉換:將n的二進位制內部表示,轉換成了人樂於看到的字元形式。
  

2、將n儲存到ASCII檔案什麼樣

#include<fstream>
using namespace std;
int main( )
{
    int n=100000;
    ofstream out("a.dat",ios::out);
    out<<n<<endl;
    return 0;
}
  執行這一段程式,是將n輸出到ASCII檔案a.dat中。
  檔案可以用記事本開啟,如圖:
  

  顯然,ASCII檔案中表示n時,也是“看起來”的樣子,而不是n在記憶體裡的實際表示形式
  

3、將n儲存到二進位制檔案什麼樣

#include<fstream>
using namespace std;
int main( )
{
    int n=100000;
    ofstream out("b.dat",ios::out|ios::binary);
    out.write((char*)&n, sizeof(n));
    return 0;
}
  執行這一段程式,是用對二進位制檔案寫入的方式,將n輸出到檔案b.dat中。
  用記事本開啟b.dat檔案,如圖:
  
  納尼?這是個神馬字?你會念嗎?開什麼玩笑!
  找一個檢視二進位制檔案的軟體(我用BinaryViewer),看到的b.txt如下:
  
  檔案為4位元組大。按高位優先的原則(將圖中顯示的4個位元組由後往前取出來),裡面儲存的數的十六進位制形式是:0x000186A0,展開成二進位制形式,自然是1 1000 0110 1010 0000,這恰是十進位制數100000在記憶體中的形式。至於為何顯示的是那麼一個怪字,需要了解漢字編碼的知識,參見《 用C++程式理解漢字的機內碼錶示》(跳轉之前,先將本文讀完)。
  
  用BinaryViewer也看一下a.txt——前文中另一個也是儲存100000的檔案,只不過,是ASCII檔案。檢視結果是:
  
  檔案共有8位元組,前面的6個位元組,儲存的是:1個'1'(ASCII碼為49,十六進位制31)、5個'0'(ASCII碼為48,十六進位制30)。
  
  由此可以看出二進位制檔案和ASCII檔案的區別:前者,用和記憶體中一樣的方式儲存資料;而後者,用和cout顯示一樣的方式儲存,存的是人“看起來”的那個樣子。
  不方便人看的二進位制檔案實際上效率更高,用途更廣,初學程式設計的童鞋,不要錯過學會它的機會。

  
  

附註:用下面的方法將待觀察的資料以二進位制形式顯示出來

  在待觀察的變數上擊滑鼠右鍵,選“Properties”,如下圖
  
  在“Format”部分,如下圖選擇“Binary”後,點選“OK”。
  
================= 迂者 賀利堅 CSDN部落格專欄=================
|== IT學子成長指導專欄 專欄文章的分類目錄(不定期更新) ==|
|== C++ 課堂線上專欄  賀利堅課程教學連結(分課程年級) ==|
|== 我寫的書——《逆襲大學——傳給IT學子的正能量》    ==|
===== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====



相關推薦

二進位制檔案ASCII檔案區別

二進位制檔案和ASCII檔案(即文字檔案)的區別,對於和計算機親近時間尚短的同學是個難題。本文用簡單的例子,試圖展示其中的道道,希望能對菜鳥們有些幫助。1、一個例子:兩種100000  有程式:#include<iostream> using namespace

MySQL的索引為什麼用B+Tree?InnDB的資料儲存檔案MyISAM的不同?

### 前言 這篇文章的題目,是我真實在面試過程中遇到的問題,某網際網路眾籌公司在考察面試者MySQL相關知識的第一個問題,我當時還是比較懵的,沒想到這年輕人不講武德,不按套路出牌,一般的問MySQL的相關知識的時候,不都是問索引優化以及索引失效等相關問題嗎?怎麼還出來了,儲存檔案的不同?哪怕考察個MVCC機

Unicode UTF-8 區別

inter tran .html 很好 會有 所有 如果 聯網 nbsp 很久很久以前,有一群人,他們決定用8個可以開合的晶體管來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為”字節“。再後來,他們又做了一些可以處

request.getAttribute() request.getParameter() 區別?

傳遞 數據類型 get 客戶端 傳遞數據 永遠 object string類 ram 當你要傳遞普通的數據類型給下一個頁面時,你在下一個頁面中就可以用getParameter()方法來獲得上一個頁面傳遞過來的數據了!(普通的數據類型是指int,float,double,st

String中"==""equals()"到底區別

之前的時候,感覺==和equals()就那麼點區別,後來才發現,不要小看一個簡簡單單的區別,裡邊學問好大啊,才有了這個念頭 接下來就看下他們之間的區別: 首先呢,比較是時候要知道比較什麼?到底是基本資

程式中斷呼叫子程式區別

兩者的根本區別表現在服務時間和服務物件上不一樣。1)呼叫子程式發生的時間是已知的和固定的,即在主程式的呼叫指令(CALL)執行時發生主程式呼叫子程式過程,呼叫指令所在位置是已知的和固定的;而中斷過程發生

linux下面/usr/localopt目錄區別

/usr/local下一般是你安裝軟體的目錄,這個目錄就相當於在windows下的programefiles這個目錄  /opt這個目錄是一些大型軟體的安裝目錄,或者是一些服務程式的安裝目錄 /opt Here’s where optional stuff is put. Trying out the

形參實參區別

剛入門的同學可能會對形參和實參的概念模糊不清。這裡小博老師帶大家回顧一下。     第一點,形參不能獨立於方法單獨存在。必須在方法內才會發生作用,也就是必須在方法中使用,不在方法外可見。而實參則可以在程式的任何地方都使用。     第二點,形參代表一個合集,具有不確定性,

alpha測試什麼意思,Beta測試區別

alpha測試是由一個使用者在開發環境下進行的測試,也可以是公司內部的使用者在模擬實際操作環境下進行的測試。alpha測試的目的是評價軟體產品的FLURPS(即功能、局域化、可使用性、可靠性、效能和支援)。尤其注重產品的介面和特色。alpha測試可以從軟體產品編碼結束之時開

【 I/O流】檔案輸入與輸出(Scanner)& Scannerio流讀寫區別?(待填坑)

對檔案進行讀取,僅需要用File物件構造一個Scanner物件Scanner in= new Scanner(Paths.get("myfile.tet"),"UTF-8");如果檔名中含反斜槓符號,需要在每個反斜槓之前加一個額外的反斜槓如:“c:\\mydirectory\

在.h檔案.m檔案裡使用import指令區別

有的程式設計師喜歡把所有import語句寫在.h檔案的頭部。而有的程式設計師則喜歡把import語句寫在.m檔案頭部。 你可能覺得寫在哪裡都無所謂。 那麼,import語句寫在.h檔案和.m檔案的哪一個都無所謂嗎? 這並不是真的。 通常,我習慣在.h檔案頭部加入所

MAC系統PKG檔案DMG檔案哪些區別&VMWare安裝Mac OS

  MAC系統中的檔案包含著兩種格式,一種PKG檔案,還有一種便是DMG檔案。許多使用者都對這兩種格式的檔案分不清,認為它們是同一種類型的檔案。其實並不是這樣的,今天,小編就為大家介紹一下這兩個格式檔案的區別。  關於PKG   pkg檔案也就是安裝包配置檔案,是製作

ASCII碼錶中的數字我們運算用的純數字區別

ASCII碼錶是一種字元編碼方式,它將所有的大小寫字母,數字,特殊字元等用一個位元組(byte)來表示,比如我們定義:char i ="9",這裡的9就是一個字元,不是數字,計算機中對應字元9的時這樣的二進位制資料:00111001。 但是如果我們定義:int i = 9

includerequire都能把另外一個檔案包含到當前檔案中,他們什麼區別?Includeinclude_once 又什麼區別

1、require 的使用方法如 require("MyRequireFile.php"); 。這個函式通常放在 PHP 程式的最前面,PHP 程式在執行前,就會先讀入 require 所指定引入的檔案,使它變成 PHP

二進位制檔案文字檔案區別聯絡

將檔案看作是由一個一個位元組(byte) 組成的,那麼文字檔案中的每個位元組的最高位都是0,也就是說文字檔案使用了一個位元組中的七位來表示所有的資訊,而二進位制檔案則是將位元組中的所有位都用上了。這就是兩者的區別;  接著,第二個問題就是檔案按照文字方式或者二進位制方式

ascii碼與二進制碼區別?

text info asc lin 二進制 -s ascii碼 國際 iso ascii編碼和二進制碼是兩個概念。ASCII主要是為了電腦顯示和傳輸拉丁字母而發明的一套編碼,二進制則是為了計算機方便計算、傳輸數據而使用的一種方法。ASCII(American Stan

OLTPOLAP區別?

oltp和olap的區別當今的數據處理大致可以分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統的關系型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易

類別的作用?繼承類別在實現中區別?

div 往裏面 原來 方法 作用 創建 屬性 實現 名稱 category 可以在不獲悉,不改變原來代碼的情況下往裏面添加新的方法,只能添加,不能刪除修改,並且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。類別主要有3個作用:1).

ComboBox 中 DisplayMember ValueMember區別

倉庫 member 綁定 不同的 bob 方便 uem combo 可重復 DisplayMember綁定的是前臺需要顯示出來的字段, ValueMember綁定的是要顯示出來的字段對應的值 所對應的值就是一條記錄裏面 有標識列ID(唯一),有顯示的列(如名稱,可重復)

http https 區別

HTTP與HTTPShttp是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,後者是443。http的連接很簡單,是無狀態的HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議要