2010-09-02 62 views
-1

我必须在文件中编写一些算法的结果。结果是一个块列表,每个块由5个数字定义:3个整数和2个浮点数。它在一个文件中的代码最简单的方法当然是纯文本的,比如像这样:如何将一组数字编码到一个文件,以便文件具有最小尺寸?

12 56 81 0.34 1.67 
124 11 76 0.75 6.11 
... 

这也是考虑文件大小考虑到最糟糕的方式。

我该如何缩小文件大小?如果这些都是整数,我只是将它们转换为字节,并将它们作为字节写入文件,并且会缩小一点。但花车更成问题。 任何想法?在C#中.net

+0

好的,经过一些评论,很明显这里有很多信息不存在。 1)是否有像byte,byte,float,byte这样的固定序列? 2)你只是想写在二进制文件,或者你想压缩到位? – 2010-09-02 13:13:15

回答

0

您可以使用类似SharpZipLib的zip库压缩文件。

+0

不是我正在寻找的解决方案 – agn 2010-09-02 11:18:12

+0

@agn - 然而,从问题的陈述来看,这是一个有效的解决方案;)。如果您有更多限制,请编辑您的问题并添加它们。 – Oded 2010-09-02 11:21:05

0

二进制可变长度将是最紧凑的(即只存储11位数字,只需要11位),但这很快变得复杂,因为您需要对类型和长度进行编码。

如何在文本中存储,但压缩(如GZipStream),这将删除几乎所有(压缩不完美),没有复杂的编码。

喜欢的东西:

using (var fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write)) 
using (var gz = new GZipStream(fs, CompressionMode.Compress)) 
using (var writer = new StreamWriter(gz)) { 
    foreach (var num in numbers) { 
    writer.Write(num); 
    writer.Write(' '); 
    } 
} 
+0

我可以做到这一点,我实际上已经做到了 - 简单的位编码,我可以肯定地说,我需要每个数字(实际上是一个字节)的最大8位,但它对于整数并不重要,对浮点数也不是微不足道的。有一些方法来将浮点数编码为字节,但我只是寻找更简单的解决方案 – agn 2010-09-02 11:17:35

1

这也是考虑文件大小考虑到最糟糕的方式。

是吗? “12”和“56”在ASCII或UTF-8编码中每个需要2个字节。 “124”需要3个字节,每个项目大致会有1个字节的分隔符。编写一个二进制int需要4个字节。类似的比较适用于浮动/双打。

因此,如果样本代表您的实际数据,文本是一种简单而紧凑的格式。灵活性是无价的。

+0

以及据我所知,将12转换为字节将只是一个字节: 00001100 ...它只需要一个字节。所以它会缩小两倍。对于一些数字 - 3次。现在我也必须在数字之间写空格,如果我编码字节,只知道一个数字就是一个字节,我不需要这样做。所以是的,它会减小尺寸 – agn 2010-09-02 11:21:12

+0

@agn:你怎么知道'00001100 00001100'是12后跟另一个12,而不是单个数字3084? – MSalters 2010-09-02 11:27:55

+0

因为我知道不会有大于256的数字......而且我总是只读一个字节。我写了一些其他评论,我忘了我没有写在主题。 – agn 2010-09-02 12:21:21

相关问题