二进制文件和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位的数据就是#@!#!@#...。当程序中用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博客专栏================= |
二进制文件和ASCII文件有何差别的更多相关文章
- 二进制文件和ASCII文件有何区别
二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题. 1.一个例子:两种100000 有程序: #include<iostream> using nam ...
- 二进制和ASCII文件的区别
二进制和ASCII文件的区别 觉得有用的话,欢迎一起讨论相互学习~Follow Me 版权声明:本文为CSDN博主「迂者-贺利坚」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出 ...
- 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)
文本文件是可以看到的字符, 二进制文件是不可视字符,如图片. 二进制文件: 包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件.计算机文件基本上分为二种:二进制文件和 ASCII( ...
- 利用PHP取二进制文件头判断文件类型
<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...
- C++学习48 对ASCII文件的读写操作
如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...
- eclipse导出带有图片、音效、其他二进制文件的jar文件的经历
先说下简单流程吧: 1.选中“项目”,右键->export->java的“jar file”->勾选“export generated clas files and resource ...
- ASCII 文件编码格式
文件编码格式 阶段一:ASCII 阶段二:ANSI(本地化) 如:GBK.GB2312 阶段三:UNICODE(国际化) 如:UTF-8 ASCII(American Standard Code fo ...
- 利用arcigs制作出 源解析要用的ASCII文件
准备:1.确定好模拟区域范围,精度,行列数 2.确定好源解析的城市规划 思路: 1.全国省级图+本地市县图-->合成一张区域图(联合) 合成之后,添加一个字段,一个数字类型字段 ...
- FormData可实现异步传输二进制文件(即异步文件上传)
XMLHttpRequest Level 2 添加了一个新的接口——FormData.它能使现在的AJAX交互更加简单.之前的AJAX在上传前,需要将表单的数据序列化.与普通的 Ajax 相比,使用 ...
随机推荐
- CSS3中的background-size(对响应性图片等比例缩放)
background-size的基本属性 background-size: 可以设定背景图像的尺寸,该属性是css3中的,在移动端使用的地方很多,比如最常见的地方在做响应性布局的时候,比如之前做的项目 ...
- 日期-用Datapicker实现前一天后一天
运用了JQuery UI Datepicker 插件和一些常用日期的方法.其中Datepicker的API具体可参考[http://api.jqueryui.com/datepicker/#optio ...
- ecshop标签
页面标题 {$page_title}页面关键字 {$keywords} 产品分类 父分类列表 {foreach from=$cate ...
- Jquery not选择器实现元素显示隐藏
初初认识jQuery的not选择器,想要实现的功能是,点击第一个div,显示第二个div,点击第一个div以外的地方,隐藏第二个div. 具体代码如下: <!DOCTYPE html> & ...
- [CSS]border边框
border: 1px solid #ccc; /*1像素 实线 灰色*/可分割成:border-width:1px;border-style: solid; border-color: #00 ...
- MVC描述对象的类关系图/调用关系图【学习笔记】
- iOS: 填充数据表格
功能:创建一个列表并填充 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lish ...
- 自己挖坑自己跳 之JsonMappingException: (was java.lang.NullPointerException) (through reference chain:)
在Web项目中,我们经常会设计一些与界面相对应的JavaBean作为Entity,而为了兼容前台传入的空值,有些字段我们会用包装类型而不是基本类型.可是往往我的Entity已经设计完成,很多时候我们会 ...
- xcode5时代如何设置Architectures和Valid Architectures
目前ios的指令集有以下几种: 1,armv6,支持的机器iPhone,iPhone2,iPhone3G及对应的iTouch 2,armv7,支持的机器iPhone4,iPhone4S 3,armv7 ...
- lc面试准备:Implement Stack using Queues
1 题目 Implement the following operations of a stack using queues. push(x) -- Push element x onto stac ...