热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C二进制文件与文本文件效率

如何解决《C二进制文件与文本文件效率》经验,为你挑选了1个好方法。

我是C的新人,我想要一些帮助.假设我需要在文件中存储仅6位数字.(假设int的大小等于4)使用文本文件或二进制文件会更有效(就内存而言)?我不确定如何面对这个问题,欢迎任何帮助



1> Sridhar Naga..:

大多数人将文件分为两类:二进制文件和ASCII(文本)文件.你真的和两个人一起工作过.您编写的任何程序(C/C++/Perl/HTML)几乎肯定都是ASCII文件.

ASCII文件定义为由ASCII字符组成的文件.它通常是使用文本编辑器创建的,如emacs,pico,vi,Notepad等.有更好的编辑器用于编写代码,但它们可能并不总是将其保存为ASCII.ASCII是国际标准.

计算机科学就是要创造良好的抽象.有时它会成功,有时却不会成功.好的抽象都是关于呈现用户可以使用的世界观.最成功的抽象之一是文本编辑器.

当您编写程序并输入注释时,很难想象此信息不会存储为字符.ASCII /文本文件实际上存储为0和1.

文件存储在磁盘上,磁盘可以用某种方式表示1和0.我们只称它们为1和0,因为它也是一种抽象.无论用什么方式将0和1存储在磁盘上,我们都不在乎,前提是我们可以这样想.

实际上,ASCII文件基本上是二进制文件,因为它们存储二进制数.也就是说,ASCII文件存储0和1.

ASCII和二进制文件的区别?

ASCII文件是存储ASCII代码的二进制文件.回想一下,ASCII码是一个存储在一个字节中的7位代码.更具体地说,有128种不同的ASCII码,这意味着只需要7位来表示ASCII字符.

但是,由于最小可行大小为1字节,因此这7位是任何字节的低7位.最重要的位是0.这意味着,在任何ASCII文件中,你都浪费了1/8的位.特别是,没有使用每个字节的最高有效位.

尽管ASCII文件是二进制文件,但有些人将它们视为不同类型的文件.我喜欢将ASCII文件视为特殊类型的二进制文件.它们是二进制文件,其中每个字节都用ASCII码编写.

完整的通用二进制文件没有这样的限制.任何256位模式都可以用在二进制文件的任何字节中.

我们一直使用二进制文件.可执行文件,目标文件,图像文件,声音文件和许多文件格式都是二进制文件.使它们成为二进制的原因仅仅在于二进制文件的每个字节可以是256位模式之一.它们不限于ASCII码.ASCII文件的示例

假设您正在使用文本编辑器编辑文本文件.因为您使用的是文本编辑器,所以您几乎都在编辑ASCII文件.在这个全新的文件中,您输入"cat".也就是说,字母'c',然后是'a',然后是't'.然后,您保存文件并退出.

怎么了?目前,我们不会担心打开文件,修改文件和关闭文件的含义机制.相反,我们关注ASCII编码.

如果查找ASCII表,您将发现0x63,0x61,0x74的ASCII代码(0x仅表示值为十六进制,而不是十进制/基数10).

Here's how it looks:
ASCII   'c'        'a'          't'
Hex     63          61          74
Binary  0110 0011   0110 0001   0111 1000

每次输入ASCII字符并保存时,都会写入与该字符对应的整个字节.这包括标点符号,空格等.

因此,当您键入"c"时,它将被保存为0110 0011到文件.

现在,有时文本编辑器会抛出你可能没想到的字符.例如,一些编辑"坚持"每行以换行符结尾.

文件在行尾可能缺少换行符的唯一位置是最后一行.有些编辑器允许最后一行以换行字符结尾.一些编辑器在每个文件的末尾添加换行符.

不幸的是,即使换行符也不是普遍标准的.在UNIX文件上使用换行符很常见,但在Windows中,通常使用两个字符来结束每一行(回车符,换行符,\ r和\n,我相信).为什么只有一个人需要两个角色?

这可以追溯到打印机.在过去,打印机返回到行首的时间等于键入两个字符所花费的时间.因此,在文件中放置了两个字符,以便让打印机有时间将打印机球移回到行的开头.

这个事实并不是那么重要.这主要是琐事.我提出这个原因的原因是你想知道为什么从Windows将文件传输到UNIX有时会生成有趣的字符.编辑二进制文件现在您知道在ASCII文件中键入的每个字符对应于文件中的一个字节,您可能会理解为什么编辑二进制文件很困难.

如果要编辑二进制文件,您真的想编辑单个位.例如,假设您要编写二进制模式1100 0011.您将如何执行此操作?

您可能很天真,并在文件中键入以下内容:

11000011

但是,到目前为止,您应该知道这不是编辑文件的各个位.如果输入"1"和"0",则实际输入的是0x49和0x48.也就是说,您将0100 1001和0100 1000输入到文件中.你实际上(间接地)一次输入8位.

有些程序允许您输入49,并将其转换为单个字节0100 1001,而不是"4"和"9"的ASCII代码.您可以将这些程序称为十六进制编辑器.不幸的是,这些可能不那么容易获得.编写一个读取类似十六进制对的ASCII文件的程序并不难,但随后将其转换为具有相应位模式的真正二进制文件.

也就是说,它需要一个看起来像这样的文件:

63 a0 de

并将此ASCII文件转换为以0110 0011开头的二进制文件(二进制为63).请注意,此文件是ASCII,这意味着真正存储的是'6','3',''(空格),'a','0'等的ASCII代码.程序可以读取此ASCII文件,然后生成相应的二进制代码并将其写入文件.

因此,ASCII文件可能包含8个字节(字符为6个,空格为2个),输出二进制文件包含3个字节,每个十六进制对一个字节.

编写二进制文件

为什么人们仍然使用二进制文件?一个原因是紧凑性.例如,假设您要编写数字100000.如果以ASCII格式输入,则需要6个字符(即6个字节).但是,如果将其表示为无符号二进制,则可以使用4个字节将其写出.

ASCII很方便,因为它往往是人类可读的,但它可以占用大量空间.您可以使用二进制文件更紧凑地表示信息.

例如,您可以做的一件事是将对象保存到文件中.这是一种序列化.要将其转储到文件,请使用write()方法.通常,将指向对象的指针和用于表示对象的字节数(使用sizeof运算符来确定)传递给write()方法.然后,该方法将存储在内存中的字节转储到文件中.

然后,您可以通过使用相应的read()方法从文件中恢复信息并将其放入对象中,该方法通常采用指向对象的指针(它应指向已分配内存的对象,无论是静态还是动态已分配)和对象的字节数,并将文件中的字节复制到对象中.

当然,你必须小心.如果您使用两个不同的编译器,或将文件从一种机器传输到另一种机器,则此过程可能不起作用.特别地,可以不同地布置对象.这可以像endianness一样简单,或者填充可能存在问题.

这种将对象保存到文件的方法既简单又简单,但它可能不是那么便携.此外,它相当于浅拷贝.如果您的对象包含指针,它将写出文件的地址.这些地址可能完全没有意义.程序运行时地址可能有意义,但如果退出并重新启动,这些地址可能会发生变化.

这就是为什么有些人发明了自己的存储对象格式:增加可移植性.

但是如果你知道你没有存储包含指针的对象,并且你正在使用相同类型的计算机系统读取文件,并且你使用相同的编译器,它应该可以工作.

这是人们有时喜欢写出整数,字符等而非整个对象的一个​​原因.它们往往更便携一些.

ASCII文件是由ASCII字符组成的二进制文件.ASCII字符是存储在一个字节中的7位编码.因此,ASCII文件的每个字节的最高有效位都设置为0.将ASCII文件视为一种特殊的二进制文件.

通用二进制文件使用所有8位.二进制文件的每个字节可以具有完整的256位串模式(与仅具有128位串模式的ASCII文件相对).

可能有一段时间,Unicode文本文件变得更加普遍.但就目前而言,ASCII文件是文本文件的标准格式.


推荐阅读
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 深入解析 Spring MVC 的核心原理与应用实践
    本文将详细探讨Spring MVC的核心原理及其实际应用,首先从配置web.xml文件入手,解析其在初始化过程中的关键作用,接着深入分析请求处理流程,包括控制器、视图解析器等组件的工作机制,并结合具体案例,展示如何高效利用Spring MVC进行开发,为读者提供全面的技术指导。 ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • 整合百度UEditor编辑器于ASP后端的实现步骤与技巧
    随着微软停止对XP系统的支持,公司已全面升级至Windows 7。早期网站创建时使用的编辑器仅兼容IE6浏览器,而如今系统更新后,原有的编辑器已无法满足新环境的需求。本文详细介绍了如何将百度UEditor编辑器整合到ASP后端,包括实现步骤和实用技巧,确保网站在新系统下仍能高效运行并提供良好的用户体验。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 本文深入探讨了层叠样式表(CSS)的核心原理与应用技巧,旨在帮助读者全面理解CSS的工作机制。从选择器、属性到布局模式,文章详细解析了CSS的关键概念,并通过实例展示了如何高效运用这些技术,提升网页设计与开发的水平。 ... [详细]
  • 在Linux/WSL环境中,本文对Shell任务的并行处理进行了详细的测试与分析。通过多种并行处理技术,如GNU Parallel和xargs,探讨了如何有效提升任务执行效率和系统资源利用率。实验结果表明,合理配置并行参数能够显著缩短任务完成时间,提高系统整体性能。此外,文章还介绍了Shell脚本编写的基本原则和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 如何使用专业软件打开和编辑PHP电影文件?
    如何使用专业软件打开和编辑PHP电影文件? ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 在Linux系统中Nginx环境下SSL证书的安装步骤与WordPress CDN的高级配置指南
    在Linux系统中,Nginx环境下安装SSL证书的具体步骤及WordPress CDN的高级配置指南。首先,安装SSL证书需要准备两个关键配置文件,并建议在操作前备份相关服务器配置文件,以确保数据安全。随后,本文将详细介绍如何在Nginx中正确配置SSL证书,以及如何优化WordPress的CDN设置,提升网站性能和安全性。 ... [详细]
  • tarzxvffilename.tar.gz顺便我们了解下linux下压缩与解压命令大全.tar解包:tarxvffilename.tar打包:tarc ... [详细]
  • 在JSP页面中调用客户端本地应用程序(例如 `C:\netterm.exe`)时,可以通过使用 `Runtime.getRuntime().exec("c:\\netterm.exe")` 实现。然而,这种方法仅在服务器端有效,若要实现在客户端执行本地程序,需要采用其他技术手段,如Java Applet或ActiveX控件,以确保安全性和兼容性。 ... [详细]
  • 如何在服务器后台运行PHP脚本?
    如何在服务器后台运行PHP脚本? ... [详细]
author-avatar
mobiledu2502895753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有