2014-01-17 48 views
-2

我正在C#中实现压缩算法。问题是我在压缩之前不知道文件大小。解决这个问题的最好方法是什么?当然,我将压缩数据存储到数组中,但在压缩之前我不知道它的大小。未知阵列大小C# - 压缩

+0

你能否给我们提供更多的细节和注意细节,如何时需要压缩和解压缩?如果你想压缩一个文件,但你不知道它的大小没有压缩,这有点令人困惑。在压缩之前,您可以知道要压缩的数据的大小,但无法知道压缩数据的大小。 – Cosmin

+0

我的意思是压缩文件的大小......我在压缩过程完成之前无法知道它。 – user216799

+0

请添加您尝试的代码,以便我可以根据需要调整我的解决方案。 – Cosmin

回答

0

要获得未压缩文件的大小,应该使用System.IO.FileInfo类,该文件的长度属性为文件大小(以字节为单位)。

在大多数情况下,我会使用这个加上10%大小的数组[s],压缩文件会更小,但有些情况下'压缩'文件实际上比原始文件大(例如,你是否尝试压缩已压缩的文件)。在使用之前,确保输出数组初始化为NULL。

输出文件的大小将是输出数组的大小减去最后的NULL列表。

金龟

-1

的压缩数据的大小只能从输入数据的大小,较新的真已知猜测。您应该为输出数据使用动态数组(或等效)。请注意输出尺寸可能比输入数据大

+0

是的人,但我不知道它是2倍大的尺寸,3倍的大小,等等。另外,我避免使用阵列的大小调整,因为我不知道它有多快。 – user216799

+0

最有可能的是,您将(取决于算法)输入大小的至多2倍的上限。但是如果你从一个缓冲区开始,说输入大小的一半,你最多可以改变两次大小。这应该不会损害性能 – PMF

0

可以使用Generic lists,而不是数组,如果你不知道数组大小:

List<byte> list = new List<byte>(); 

那么你不需要设置列表大小,它会自动只要你添加新项目发展。

+0

+1实际上它是正确的,即使我不会使用列表,我甚至不会将所有数据保存在内存中(除非是需求)。 –

1

您可以使用这样的事情:

byte[] CompressByteArray(byte[] uncompressedData) 
    { 
     byte[] compressedData; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (BinaryWriter writer = new BinaryWriter(ms)) 
      { 
       // dummy compression algorithm 
       for (int i = 0; i < uncompressedData.Length; i += 2) 
       { 
        var newByte = uncompressedData[0] + uncompressedData[1]; 
        writer.Write(newByte); 
       } 
      } 

      ms.Flush(); 
      ms.Position = 0; 

      compressedData = ms.ToArray(); 
     } 

     return compressedData; 
    } 

但是它是非常低效的。您还应该将输入文件作为流,而不是将字节数组作为字节数组,如果不希望内存被填充。基本上你需要从流中读取数据并写入另一个数据流(也许MemoryStream实际上应该是一个文件流,以便在压缩大文件时直接写入磁盘上的临时文件)。