当前位置: 首页 > news >正文

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




相关文章:

  • 实战6 Nginx的web日志导入到MongoDB数据库
  • dell c1100 安装系统(进入bios、超线程、磁盘阵列等设置方法)
  • FineUI小技巧(1)简单的购物车页面
  • 关于腾讯QQ登录提示“个人文件夹没有读写权限,请修改相应权限后再尝试”的解决方法...
  • 第三节 改变字符串的值
  • 再读《精通css》00
  • [转]个数为n的只读数组包含元素[1, n-1],求其中一个重复的数
  • 韩立刚老师51cto课程学习路线图
  • C#如何判断两个数组相等
  • 如何vs升级后10和12都能同时兼容
  • 应用wordpress
  • 使用 EF Power Tool Code Frist 生成 Mysql 实体
  • 【LeetCode】37. Sudoku Solver
  • 融合成就卓越F5诠释“软件定义”新内涵
  • mysql 用户管理和权限设置
  • 2017 前端面试准备 - 收藏集 - 掘金
  • docker python 配置
  • git 常用命令
  • Java面向对象及其三大特征
  • Netty 4.1 源代码学习:线程模型
  • Nodejs和JavaWeb协助开发
  • python_bomb----数据类型总结
  • spring boot 整合mybatis 无法输出sql的问题
  • 编写高质量JavaScript代码之并发
  • 分享一份非常强势的Android面试题
  • 简单数学运算程序(不定期更新)
  • 开源SQL-on-Hadoop系统一览
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何进阶一名有竞争力的程序员?
  • 使用 @font-face
  • 选择阿里云数据库HBase版十大理由
  • #if和#ifdef区别
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (003)SlickEdit Unity的补全
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)appium-desktop定位元素原理
  • .chm格式文件如何阅读
  • .CSS-hover 的解释
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET 依赖注入和配置系统
  • .NET实现之(自动更新)
  • [ACTF2020 新生赛]Include
  • [Android]使用Git将项目提交到GitHub
  • [C++][基础]1_变量、常量和基本类型
  • [CSS]CSS 字体属性
  • [java进阶]——方法引用改写Lambda表达式
  • [Linux_IMX6ULL应用开发]-Makefile
  • [NLP] LlaMa2模型运行在Mac机器
  • [Oh My C++ Diary]用cout输出流保留输出小数位数的方法
  • [one_demo_18]js定时器的示例
  • [Oracle]如何观察Table 的各种Lock 之间的冲突
  • [orleans2.1]这是你没玩过的船新版本