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

File 在二进制文件和文本文件中分别存储数字需要多少字节,file,c++11,binary,file-handling,File,C++11,Binary,File Handling,如果我想在一个文件中存储一个数字,比如说56789,在二进制文件和文本文件中分别需要多少字节来存储它?我想知道如何将字节分配给二进制和文本文件中的数据。这取决于: 文本编码和数字系统(十进制、十六进制等) 签署/未签署 单整数或多整数(需要分隔符) 数据类型 目标体系结构 压缩编码的使用 在ASCII码中,字符占用1字节。在UTF-8中,字符需要1到4个字节,但数字总是需要1个字节。在UTF-16或Unicode中,每个字符需要2个或更多字节 非ASCII格式可能需要为文件增加2个字节(),

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

这取决于:

  • 文本编码和数字系统(十进制、十六进制等)
  • 签署/未签署
  • 单整数或多整数(需要分隔符)
  • 数据类型
  • 目标体系结构
  • 压缩编码的使用
在ASCII码中,字符占用1字节。在UTF-8中,字符需要1到4个字节,但数字总是需要1个字节。在UTF-16或Unicode中,每个字符需要2个或更多字节

非ASCII格式可能需要为文件增加2个字节(),这取决于创建文件时使用的编辑器和/或设置

但是假设您将数据存储在一个简单的ASCII文件中,或者讨论变得不必要的复杂

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

在十六进制中,使用数字
0-9
和字母
a-f
表示数字。像
3423432423
这样的十进制(以10为基数)将是十六进制(以16为基数)的
7F88655C7
。在第一个系统中我们有11个数字,在第二个系统中只有9个数字。最小基数为2(数字
0
1
),公共最大基数为64(base-64)。从技术上讲,使用ASCII可以达到base-96或base-100,但这是非常罕见的

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

在某些情况下,您可能需要存储多个数字。你需要一个分隔符来区分数字。逗号(
)、冒号(
)、分号(
)、管道(
|
)或换行符(
LF
CR
)或在Windows上(
CRLF
,需要2个字节)在djungle中都被视为合法的数字分隔符

什么是数字?你头脑中的数量8的概念或想法就是数字。在石头、纸张、磁带或屏幕上的像素上对该概念的任何表示都只是:表示。它们是代表你在大脑中所理解的东西的符号。那些是数字。请不要把数字和数字混淆,这个区别是数学和计算机科学的基础。 在这些情况下,您需要为每个数字的分隔符计算一个附加字符。或者可能是每一个数字减去一。这取决于您是要用标记终止每个数字,还是要将数字彼此分开:

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

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

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

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

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

16位浮点值将占用2个字节。对于C和C++,必须考虑底层架构。32位体系结构上的通用
整数
将占用4个字节。同样的代码,在64位体系结构下编译,需要8个字节

这些简单规则也有例外。例如,Google的protobuf使用了一个利用可变长度编码的Z字形VarInt实现


编辑:添加了托马斯·韦勒的建议

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

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

如果在一个文件中存储十个、一百个、数千个或数百万/数十亿个数字,那么这种开销就变得越来越无关紧要了


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

如上所述,管理费用是在相关情况下产生的

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

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


尽管如此,上述推理与您选择的格式无关。

我在这方面还不太成熟;然而,我相信这不仅仅是一个关于内容的案例,还有附加的元数据。但是如果你只是在谈论数字,你可以将它存储在ASCII或二进制格式中

在二进制中,
56789
可以转换为
11011101110101
;有一种“简单”的方法可以在纸上解决这个问题。但是,这是一个你可以用来转换它的网站


11011101110101
有16个字符,因此16位是两个字节。

在你发布任何问题之前,你应该做一下研究


文件的大小取决于许多因素,但为了简单起见,如果使用UTF-8编码,文本格式的数字将占用每个字符1字节。另一方面,长数据类型的二进制值将占用4个字节。

在给定的基数中存储数字所需的位数是
ceil(log(n)/log(base))

存储为十进制将以10为基数,存储为十六进制文本将以16为基数。以二进制形式存储将是一种错误
1<LF>
2<LF>
3<LF>
1,2,3
2134,
-3
56789 in base 2 needs 15.793323887 bits (16)
56789 in base 10 needs 4.754264221 decimal digits (5)
56789 in base 16 needs 3.948330972 hex digits (4)
56789 in base 64 needs 2.632220648 characters (3)