【转】二进制文件和ASCII文件有何区别

二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题。本文用简单的例子,试图展示其中的道道,希望能对菜鸟们有些帮助。

 

1、一个例子:两种100000

  有程序:

 
  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文件什么样

 
  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保存到二进制文件什么样

 
  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”。
   

 


 

================= 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql优化和索引_mysql优化和索引

表的优化1.定长与变长分离如 int,char(4),time核心且常用字段&#xff0c;建成定长&#xff0c;放在一张表&#xff1b;而varchar,text,blob这种变长字段适合单放一张表&#xff0c;用主键与核心表关联。2.常用字段和不常用字段要分离3.在 1 对多需要关联统计的字段上&#xff…

【转】为什么不能使用字符流读取非文本的二进制文件?

读取文件 刚学Java的IO流部分时&#xff0c;书上说只能使用字节流去读取图片、视频等非文本二进制文件&#xff0c;不能使用字符流&#xff0c;否则文件会损坏。所以我就一直记住这一点了&#xff0c;但是为什么不能使用&#xff0c;这一直是我的一个疑惑。今天&#xff0c;我…

mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块&#xff0c;最后到达存储引擎。image以下所说的都基于InnoDb引擎。当有一条记录需要更新的时候&#xff0c;InnoDB引擎会先把记录写到redo log里面&#xff0c;并更新内存&#xff0c;这个时候更新就算完成了。InnoDb…

【转】文本文件和二进制文件区别及java中字节流和字符流归纳

首先在物理上文本文件和二进制文件并没有区别&#xff0c;都是以二进制&#xff10;&#xff11;的形式存放于存储介质中&#xff0c;他们的区别只是逻辑上的区别&#xff0c;这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件&#xff0c;常见的编码有ASCII编码…

mysql查询后从高到低排序_[MySQL基础]三、排序查询

排序查询语法&#xff1a;SELECT查询列表FROM表[WHERE 筛选条件]ORDER BY 排序列表 [ASC|DESC]; #[ ]中的内容表示可选特点&#xff1a;asc代表的是升序&#xff0c;desc代表的是降序&#xff0c;如果不写&#xff0c;默认是升序order by子句中可以支持单个字段、多个字段、表达…

【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)

转自&#xff1a;http://blog.csdn.net/jiangqin115/article/details/42684017 UTF-8编码的文本文档&#xff0c;有的带有BOM (Byte Order Mark, 字节序标志)&#xff0c;即0xEF, 0xBB, 0xBF&#xff0c;有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动…

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器&#xff1a;attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前&#xff0c;PM让我在部门内部进行一次关于“内存泄露”的专题分享&#xff0c;我为此准备了一份PPT。今天无意中将其翻出来&#xff0c;觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此&#xff0c;今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

mysql数据库连接地址utf8_在Python中连接到MySQL数据库时UTF8不工作

我正在努力使Python更好地使用UTF-8编码的MySQL数据库&#xff0c;例如&#xff0c;挪威字符。我找了好几个小时&#xff0c;但没能找到像预期的那样有效的东西。以下是从数据库中提取的示例表&#xff1a;mysql> select * from my_table;---------------------| id | shop_…

【转】.NET Remoting

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作 用 减轻运行应用程序的系统开销 目录 1 介绍2 .NET Remoting的原理 ▪ 1.NET Rem…

python多重赋值技巧_python教程12课:多元赋值、多重赋值、运算符以及判断字符串类型...

# 多元赋值&#xff1a;# x,y,z 和 1,2,‘String是两个元组&#xff0c;只不过元组的 () 被省略掉了x, y ,z 1, 2, Stringprint(x, y, z)(x, y ,z) (3, 4, String)print(x,y,z)# 一般用在交换变量值#交换变量值常规思路x 10,y 20z 30x ,y, z y,z,xprint(x,y,z)#使用多元赋值…

【转】关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集&#xff08;Assembly&#xff09;和应用程序域&#xff08;AppDomain&#xff09;的话题&#xff0c;着重介绍了两个不同的程序集加载方式——独占方式和共享方式&#xff08;中立域方式&#xff09;&#xff1b;以及基于进程范围内的字符串驻…

python正则表达式处理txt_Python文本处理服务(re正则表达式例子)

正则表达式例子检查对子在此示例中&#xff0c;我们将使用以下帮助函数来更优雅地显示匹配对象&#xff1a;def displaymatch(match): if match is None: return None return % (match.group(), match.groups())假设你在写一个扑克程序&#xff0c;一个玩家的一手…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆&#xff0c;值类型与引用类型 深入浅出图…

bi 存储过程方案_BI 系统中容易被忽视的数据源功能

BI 系统中容易被忽视的数据源功能用户在选购 BI 解决方案的时候&#xff0c;常常会更关注界面环节的功能指标&#xff0c;比如美观性、操作的流畅性、移动端支持等等。毕竟&#xff0c;BI 是要给业务人员使用的&#xff0c;这些看得见的内容一般不容易被遗漏。然而&#xff0c;…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆&#xff0c;值类型与引用类型 深入浅…

matlab将二值图像与原图重叠_图像处理matlab及图像融合图像镶嵌图像拼接

要把double的图像(范围是0到1)再次转化为256灰度值的&#xff0c;可以这样Igrey uint8(I2*255)图像类型转换函数&#xff1a;dither() 通过颜色抖动&#xff0c;把真彩图像转换成索引图像或灰度图象转换成二值图像gray2ind() 将灰度图像(或二值图像)转换成索引图像grayslice() …

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC)&#xff0c;但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外&#xff0c;了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 本文将介绍值类型与引用类…

mysql udf sm4_SM4国密算法Java版

根据 国密SM4 文档 编写的一个Java 加密解密样例package javasm4;/**** author Jeen*/public class JavaSM4 {public static int[] key new int[4];//密钥public static int[] temp new int[4];//中间量 存储运算结果public static int[] rkey new int[32];//轮密钥public s…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)

一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤&#xff1a; 调用中间语言&#xff08;IL&#xff09;中的newobj指令&#xff0c;为表示某个特定资源的类型实例分配一定的内存空间。初始化上一步所得的内存&#xff0c;设置资源的初始状态&#xff0c;从而…