分别在二进制和文本文件中存储数字需要多少字节

pro*_*mer 5 binary file file-handling c++11

如果我想存储一个数字,比如说 56789 在一个文件中,分别需要多少字节才能将它存储在二进制文件和文本文件中?我想知道如何将字节分配给二进制和文本文件中的数据。

pid*_*pid 5

这取决于:

  • 文本编码和数字系统(十进制、十六进制等等...)
  • 签署/未签署
  • 单个整数或多个(需要分隔符)
  • 数据类型
  • 目标架构
  • 使用压缩编码

在 ASCII 中,一个字符占 1 个字节。在 UTF-8 中,一个字符占用 1 到 4 个字节,但数字总是占用 1 个字节。在 UTF-16 或 Unicode 中,每个字符需要 2 个或更多字节。

非 ASCII 格式的文件可能需要额外的 2 个字节(初始 BOM),这取决于创建文件时使用的编辑器和/或设置。

但是让我们假设您将数据存储在一个简单的 ASCII 文件中,否则讨论会变得不必要地复杂。

我们还假设您使用十进制数字系统。

在十六进制中,您使用数字0-9和字母a-f来表示数字。十进制(基-10)等34234324423。将7F88655C7十六进制(碱-16)。在第一个系统中,我们有 11 位数字,在第二个系统中只有 9 位数字。最小基数为 2(数字01),常见的最大基数为 64(基数为 64)。从技术上讲,使用 ASCII,您可以达到 base-96 或 base-100,但这种情况非常罕见。

每个数字 ( 0-9) 将占用一个字节。如果您有带符号的整数,则额外的减号将引导数字(因此负数会额外收取 1 个字节)。

在某些情况下,您可能希望存储多个数字。您将需要一个分隔符来区分数字。逗号 ( ,)、冒号 ( :)、分号 ( ;)、管道 ( |) 或换行符 ( LFCR或在 Windows 上CRLF,需要 2 个字节) 在 djungle 中都被观察到作为数字的合法分隔符。

什么是数字?你头脑中的数字8的概念或想法就是数字。在石头、纸张、磁带或屏幕上的像素上对该概念的任何表示都只是:表示。它们是代表你在大脑中理解的符号。那些是数字。请不要将数字与数字混淆,这种区别是数学和计算机科学的基础。

在这些情况下,您希望为每个数字的分隔符计算一个附加字符。或者也许每个数字减一。这取决于您是想用标记终止每个数字还是数字彼此分开

示例(三位数字和三个换行符):6 个字节

1<LF>
2<LF>
3<LF>
Run Code Online (Sandbox Code Playgroud)

示例(三位数字和两个逗号):5 个字节

1,2,3
Run Code Online (Sandbox Code Playgroud)

示例(四位数字和一个逗号):5 个字节

2134,
Run Code Online (Sandbox Code Playgroud)

示例(符号和一位数字):2 个字节

-3
Run Code Online (Sandbox Code Playgroud)

如果您以二进制格式存储数据(不要与二进制数系统混淆,后者仍然是文本格式),占用的内存取决于整数类型(或者更好的是整数的位长)。

一个八位字节 (0..255) 将占用 1 个字节。不需要分隔符或前导标志。

16 位float将占用 2 个字节。对于 C 和 C++,必须考虑底层架构。integer在 32 位体系结构上的通用将占用 4 个字节。针对 64 位体系结构编译的完全相同的代码将占用 8 个字节。

这些平面规则也有例外。例如,Google 的protobuf使用了一种利用可变长度编码zig-zag VarInt实现。

这是VarIntC/C++ 中的实现


编辑:添加了 Thomas Weller 的建议

除了实际的文件内容之外,您还必须存储有关文件的元数据(用于簿记,例如第一个扇区、文件名、访问权限等)。对于占用磁盘空间的文件,此元数据未显示,但实际上存在。

如果您存储在一个单独的文件中的每个数字,如数字10文件中result-10,这些元数据条目将占据比数字本身更多的空间。

如果您在一个文件中存储十、百、千或数百万/十亿个数字,则该开销变得越来越无关紧要。

更多关于元数据在这里。


编辑:更清楚地了解文件开销

如上所述,开销在相关情况下是相关的。

但这不是文本格式和二进制格式之间的区别。正如 doug65536 所说,无论您如何存储数据,如果文件系统结构相同,都没有关系。

文件是一个文件,如果它包含二进制数据或 ASCII 文本,则它是独立的。

尽管如此,上述推理独立于您选择的格式。