二进制文件和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文件有何差别

时间: 2024-10-26 07:30:20

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

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

二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题. 1.一个例子:两种100000 有程序: [cpp] view plain copy print? #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

C/C++之文件打开方式差别

一.引言 在上一篇中,需要获取文件的大小,但是获取的文件大小与从文件中读取的数据大小总是对不上(10行数据,文件大小是129,但是读取数据是119),因此,实现的服务器总是出现这个错误:net::ERR_CONTENT_LENGTH_MISMATCH 二.原因 造成这个错误的原因是,获取文件大小时,是使用seekg函数,而它是安字节来跳转读取位置的,但是读取文件时,我却使用了以文本打开的方式来读取文件.而以文本的方式读取文件时每个平台是会对行结束符做处理的.比如说,windows下会自动的把\r

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

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