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

本文关键字:未压缩 压缩 然后 为什么 | 更新日期: 2023-09-27 17:56:17

>我正在使用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;
    }
}
}

谁能帮我为什么会这样?

谢谢

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

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

(事实上,这很奇怪,因为解压缩器正在读取outputStream,也写入outputStream坏主意。使用两个不同的流。

您还应该在写入每个流之后,在其他人想要读取它之前倒带每个流,例如

inputStream.Position = 0;

在这种情况下,SevenZipLib可能会为您执行此操作,但是通常,如果您希望从流的开头开始执行某些操作,则应适当地重置它。


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

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

正如我所说,您也应该进行适当的其他更改。

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

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


请看这段代码:

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

您正在从输出流压缩输出流。对于较大的数据,它可能会失败。进行更改,使其读取

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