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

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

1、一个例子:两种100000

  有程序:

[cpp] view plain copy

print?

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

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

[cpp] view plain copy

print?

  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?

  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

时间: 2024-11-02 23:41:54

二进制文件和ASCII文件有何区别的相关文章

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

二进制文件和ASCII文件(即文本文件)的差别,对于和计算机亲近时间尚短的同学是个难题.本文用简单的样例,试图展示当中的道道,希望能对菜鸟们有些帮助. 1.一个样例:两种100000 有程序: #include<iostream> using namespace std; int main( ) { char c[8]="100000"; int n=100000; cout<<"c="<<c<<endl; cout&

利用PHP取二进制文件头判断文件类型

<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 7790 => 'exe', 7784 => 'midi', 8297 => 'rar', 255216 => 'jpg', 7173 => 'gif', 6677 => 'bmp', 13780 => 'png' ); foreach($files as $file) {

使用Preplot批量将ascii文件转为二进制文件

运行 -> cmd,输入: for /r . %i in (*.dat) do preplot %i 其中:for /r . %i in (*.dat)表示在当前目录下,查找dat扩展名的文件 命令的后半部分表示循环使用preplot处理. 使用时注意修改需要处理的目录.查找文件规则及preplot文件所在的路径 ------------------------------------------------------ 或者建立一个txt文件,修改为bat后缀,里面写入: for /r . %

二进制文件和普通文件(文本文件)区别

1. 定义: 所有对计算机有所了解的人肯定都知道计算机的存储在物理上事二进制形式的.所以文本文件与二进制文件的区别并不是物理上,而是逻辑上的.其本质是两者在编码层次上的差异.简单的来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等.二进制文件是基于值编码的文件,你可以根据应用的具体情况自定义自己的编码. 从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8).而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定.

eclipse导出带有图片、音效、其他二进制文件的jar文件的经历

先说下简单流程吧: 1.选中“项目”,右键->export->java的“jar file”->勾选“export generated clas files and resources”->next->next->在“select the class of the application entry point”里面选择入口类->finish. 2.流程看起来不复杂,但是对于一个刚学java的人来说,可能要抓狂:java是区分大小写的,包括文件名.这一定要注意!

DataSet与二进制文件和XML文件

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

各种软核处理器二进制文件FPGA初始化文件生成程序

不管是MIPS, Nios II, MicroBlaze, MSP430, 8051, OpenRISC, OpenSPARC, LEON2/LEON3等等软核处理器,在FPGA上实现的时候我们通常需要一部分片上RAM存储bootloader,可以使用gcc的objcopy把bootloader的text, exception vector, rodata, data or bss等你需要的内容copy出来,可以通过-O binary生成二进制文件,可以通过-j .section提取你要的sec

FormData可实现异步传输二进制文件(即异步文件上传)

XMLHttpRequest Level 2 添加了一个新的接口——FormData.它能使现在的AJAX交互更加简单.之前的AJAX在上传前,需要将表单的数据序列化.与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件. 边学边做,我也尝试做了一个上传图片的功能,如果以前可能要使用form提交或其他黑魔法,现在使用FormData就可以实现. 但是FormData存在兼容问题,详细请查看: https://developer.mozilla.org/zh-

java——IO(普通文件,二进制文件,压缩文件 )

二进制文件 压缩包 原文地址:https://www.cnblogs.com/zsben991126/p/11751741.html