二进制文件和ASCII文件有何区别

Posted 重剑无锋 大巧不工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制文件和ASCII文件有何区别相关的知识,希望对你有一定的参考价值。

二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题。

1、一个例子:两种100000

  有程序:

[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main( )  
  4. {  
  5.    char c[8]="100000";  
  6.    int n=100000;  
  7.    cout<<"c="<<c<<endl;  
  8.    cout<<"n="<<n<<endl;  
  9.    return 0;  
  10. }  

  运行结果:
  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位的数据就是#@!#!@#...。当程序中用cout<<n的方式显示n值时,给出的是100000。可敬的cout!
  实际上,cout输出过程中,计算机已经给我们做了转换:将n的二进制内部表示,转换成了人乐于看到的字符形式。
  

2、将n保存到ASCII文件什么样

[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. #include<fstream>  
  2. using namespace std;  
  3. int main( )  
  4. {  
  5.     int n=100000;  
  6.     ofstream out("a.dat",ios::out);  
  7.     out<<n<<endl;  
  8.     return 0;  
  9. }  

  运行这一段程序,是将n输出到ASCII文件a.dat中。
  文件可以用记事本打开,如图:
  
  显然,ASCII文件中表示n时,也是“看起来”的样子,而不是n在内存里的实际表示形式
  

3、将n保存到二进制文件什么样

[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. #include<fstream>  
  2. using namespace std;  
  3. int main( )  
  4. {  
  5.     int n=100000;  
  6.     ofstream out("b.dat",ios::out|ios::binary);  
  7.     out.write((char*)&n, sizeof(n));  
  8.     return 0;  
  9. }  

  运行这一段程序,是用对二进制文件写入的方式,将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”。
  

 

转:http://blog.csdn.net/sxhelijian/article/details/29594687#comments

以上是关于二进制文件和ASCII文件有何区别的主要内容,如果未能解决你的问题,请参考以下文章

ascii码与二进制码有何区别?

ascii码与二进制码有何区别?

请问啥是二进制文件 啥是ASCII 啥是文本文件 它们之间有啥区别

文本文件和二进制文件的区别

文本文件和二进制文件的区别

网络传输-文本文件和二进制文件的区别