为什么压缩然后是不同长度的未压缩流

时间:2011-05-12 07:02:46

标签: c# .net compression 7zip sevenzipsharp

我正在使用SevenZipSharp库来压缩然后解压缩包含简单序列化对象的MemoryStream。但是,压缩和解压缩的流具有不同的长度。

从下面的代码中我得到

输入长度:174 输出长度:338

(包含SevenZipSharp dll作为参考,7z.dll包含在项目输出中)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace DataTransmission {
class Program {
    static void Main(string[] args)
    {

        SevenZip.SevenZipCompressor compressor = new SevenZip.SevenZipCompressor();
        //compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2;
        //compressor.CompressionLevel = SevenZip.CompressionLevel.Normal;

        MemoryStream inputStream = new MemoryStream();

        Person me = new Person("John", "Smith");
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(inputStream, me);

        Int32 inputStreamLength = (Int32)inputStream.Length;

        MemoryStream outputStream = new MemoryStream();

        compressor.CompressStream(inputStream, outputStream);
        SevenZip.SevenZipExtractor decompressor = new SevenZip.SevenZipExtractor(outputStream);
        decompressor.ExtractFile(0, outputStream);
        Int32 outputStreamLength = (Int32)outputStream.Length;


        Console.WriteLine("Input length: {0}", inputStreamLength);
        Console.WriteLine("Output length: {0}", outputStreamLength);

        Console.ReadLine();
    }
}

[Serializable]
public class Person {
    public string firstName;
    public string lastName;

    public Person(string fname, string lname) {
        firstName = fname;
        lastName = lname;
    }
}

}

任何人都可以帮我解释为什么会这样吗?

谢谢,

2 个答案:

答案 0 :(得分:5)

尽管已包含数据,但您已解压缩为outputStream。您应该使用 new MemoryStream作为输出。

(事实上,这很奇怪,因为解压缩程序正在从 outputStream读取并将写入 outputStream。不好主意。使用两个不同的流。)

您还应该在写完每个流之后以及其他想要阅读的内容之前回放每个流,例如:与

inputStream.Position = 0;

在这种情况下,SevenZipLib可能正在为你做这件事,但一般来说,如果你想要从流的开头采取行动,你应该适当地重置它。


我刚刚对您的代码进行了以下更改,此时输入和输出的长度相同:

MemoryStream targetStream = new MemoryStream();
decompressor.ExtractFile(0, targetStream);
Int32 outputStreamLength = (Int32)targetStream.Length;

正如我所说,你也应该做出适当的其他改变。

答案 1 :(得分:1)

  

但是,压缩和解压缩的流具有不同的长度

这就是压缩的全部目的......


看看这段代码:

  SevenZip.SevenZipExtractor decompressor = 
       new SevenZip.SevenZipExtractor(outputStream);
  decompressor.ExtractFile(0, outputStream);

您正在将 outputStream 解压缩到 outputStream。它可能会因较大的数据而失败。进行更改以便读取

  SevenZip.SevenZipExtractor decompressor = 
      new SevenZip.SevenZipExtractor(compressedStream);
  decompressor.ExtractFile(0, outputStream);