File 在二进制文件和文本文件中分别存储数字需要多少字节
如果我想在一个文件中存储一个数字,比如说56789,在二进制文件和文本文件中分别需要多少字节来存储它?我想知道如何将字节分配给二进制和文本文件中的数据。这取决于: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个字节(),
- 文本编码和数字系统(十进制、十六进制等)
- 签署/未签署
- 单整数或多整数(需要分隔符)
- 数据类型
- 目标体系结构
- 压缩编码的使用
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)