如果我想存储一个数字,让我们在文件中说56789,需要多少字节才能将它存储在二进制文件和文本文件中?我想知道如何将字节分配给二进制文件和文本文件中的数据。
答案 0 :(得分:3)
取决于:
在ASCII中,一个字符需要1个字节。在UTF-8中,字符需要1到4个字节,但数字总是占用1个字节。在UTF-16或Unicode中,每个字符需要2个或更多字节。
非ASCII格式可能需要额外的2个字节(initial BOM)用于文件,这取决于创建文件时使用的编辑器和/或设置。
但我们假设您将数据存储在一个简单的ASCII文件中,或者讨论变得不必要地复杂。
我们还假设您使用十进制数字系统。
在十六进制中,您使用数字
0-9
和字母a-f
来表示数字。像34234324423
这样的十进制(基数为10)将是十六进制的7F88655C7
(base-16)。在第一个系统中,我们有11位数字,在第二个系统中只有9位数字。最小基数为2(数字0
和1
),公共最大基数为64(base-64)。从技术上讲,使用ASCII可以达到基数-96可能基数为100,但这种情况非常罕见。
每个数字(0-9
)将占用一个字节。如果您有有符号整数,则附加的减号将引导数字(因此负数会增加1个字节)。
在某些情况下,您可能需要存储多个数字。您将需要一个分隔符来区分数字。逗号(,
),冒号(:
),分号(;
),竖线(|
)或换行符(LF
,CR
或者在Windows CRLF
上,占用2个字节)已经在djungle中被观察为数字的合法分隔符。
什么是数字?在您的头部中的数量 8 的概念或想法是数字。在石头,纸张,磁带或屏幕上的像素上表示该概念的只是:表示。它们代表了你在大脑中所理解的东西。那些是数字。请不要将数字与数字混淆,这种区别是数学和计算机科学的基础。
在这些情况下,您希望为每个数字的分隔符计算一个额外字符。或者每个数字减去一个。这取决于你是否要用标记终止每个数字或将数字彼此分开
:示例(三位数和三位换行符):6个字节
1<LF>
2<LF>
3<LF>
示例(三位数和两个逗号):5个字节
1,2,3
示例(四位数和一个逗号):5个字节
2134,
示例(符号和一位数):2个字节
-3
如果您以二进制格式存储数据(不要与二进制数字系统混淆,这仍然是文本格式),占用的内存依赖于整数类型(或者更好,整数的位长)。
八位字节(0..255)将占用1个字节。不需要分隔符或前导符号。
16位float
将占用2个字节。对于C和C ++,必须考虑底层架构。 32位体系结构上的公共integer
将占用4个字节。针对64位架构编译的完全相同的代码将占用8个字节。
flat 规则有例外情况。例如,Google的 protobuf 使用 zig-zag VarInt 实现,该实现利用可变长度编码。
Here is a VarInt
implementation in C/C++
编辑:添加了Thomas Weller的建议
除了实际文件 CONTENT 之外,您还必须存储有关该文件的元数据(用于簿记,例如第一个扇区,文件名,访问权限等)。磁盘上的文件占用空间没有显示此元数据,但实际上是存在的。
如果将每个数字存储在文件10
中的单独文件(例如数字result-10
)中,则这些元数据条目将占用比数字本身更多的空间。
如果您在一个文件中存储十个,一百个,数千个或数百万个/十亿个数字,那么开销就越来越无关紧要了。
编辑:更清楚文件开销
如上所述,开销是在相关的情况下进行的。
但它不是文本和二进制格式之间的区别。正如doug65536所说,无论你存储数据,如果文件系统结构相同,那都没关系。
文件是一个文件,如果它包含二进制数据或ASCII文本,则独立。
但是,上述推理与您选择的格式无关。
答案 1 :(得分:1)
在给定数字基数中存储数字所需的位数为ceil(log(n)/log(base))
。
存储为十进制将为基数10,存储为十六进制文本将为基数16.存储为二进制将为基数2.
当以二进制形式存储时,通常需要将8的倍数或2的幂乘以,但是可以以压缩格式存储具有异常位数的值。
给出您的示例编号(暂时忽略负数):
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)
代表符号需要额外的字符或位。
要查看二进制文本与文本的比较方式,假设一个字节为8位,每个ASCII字符将为文本编码中的一个字节(8位)。一个字节的范围是0到255,十进制数字的范围是0到9.每个字符(8位)可以编码每字节(log(10)/log(2))
一个数字的约3.32位。二进制编码可以每字节存储8位数。将数字编码为文本需要大约2.4倍的空间。如果你填写你的数字所以在字段中排队,那么数字是非常差的存储编码,典型宽度为10位,你将存储80位,这将只有33位二进制编码数据。
答案 2 :(得分:0)
我在这个问题上并不太发达;但是,我认为它不仅仅是内容的情况,而且还附带了META-DATA。但如果你只是谈论这个数字,你可以用ASCII或二进制形式存储它。
在二进制文件中,2016-09-01 2016-09-03 (partial week)
2016-09-04 2016-09-10 (full week)
2016-09-11 2016-09-17 (full week)
2016-09-18 2016-09-24 (full week)
2016-09-25 2016-09-30 (partial week)
可以转换为56789
;有一个简单的&#39;在纸上解决这个问题的方法。但是,http://www.binaryhexconverter.com/decimal-to-binary-converter是一个可以用来转换它的网站。
1101110111010101
有16个字符,因此16位是两个字节。
答案 3 :(得分:0)
每个整数通常约为4个字节的存储空间。因此,如果您在文本文件中以二进制形式存储数字,并且二进制等效项为1101110111010101,则该二进制数中有16个整数。 16 * 4 = 64.因此,您的号码将占用大约64字节的存储空间。如果您的整数存储在64位而不是32位,则每个整数将占用8个字节的存储空间,因此您的总数将等于128个字节。
答案 4 :(得分:-1)
在发布任何问题之前,您应该进行研究。
文件的大小取决于许多因素,但为了简单起见,如果使用UTF-8编码,则在文本格式中,每个字符的数字将占用1个字节。另一方面,长数据类型的二进制值将占用4个字节。