zoukankan      html  css  js  c++  java
  • 二进制文件和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个字节为''(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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====




  • 相关阅读:
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结v2
    JS设置cookie、读取cookie、删除cookie
    Atitit 图像处理30大经典算法attilax总结
    Atitit数据库层次架构表与知识点 attilax 总结
    Atitit 游戏的通常流程 attilax 总结 基于cocos2d api
    Atitti css transition Animation differ区别
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
    Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式
    Atitit 混合叠加俩张图片的处理 图像处理解决方案 javafx blend
    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3790600.html
Copyright © 2011-2022 走看看