GZipStream无法正确解压缩数据

时间:2019-08-09 09:59:49

标签: c# gzip

我正在尝试使用GZipStream压缩数据。代码非常简单:

// Serialize
var ms = new MemoryStream();
ProtoBuf.Serializer.Serialize(ms, result);
ms.Seek(0, SeekOrigin.Begin);

// Compress
var ms2 = new MemoryStream();
GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress);
ms.CopyTo(zipStream);
zipStream.Flush();

// Test
ms2.Seek(0, SeekOrigin.Begin);
var ms3 = new MemoryStream();
var unzipStream = new GZipStream(ms2, CompressionMode.Decompress);
unzipStream.CopyTo(ms3);

System.Diagnostics.Debug.WriteLine($"{ms.Length} =? {ms3.Length}");

结果应该相等,但是我得到了:

244480 =? 191481

GZipStream是否无法解压缩自身压缩的流?还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

摘自GZipStream.Flush的文档:

  

此方法的当前实现不刷新内部缓冲区。放置对象时,将清空内部缓冲区。

这适合于没有足够的数据写入ms2。尝试将zipStream包装在using块中:

var ms2 = new MemoryStream();
using (GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress))
{
    ms.CopyTo(zipStream);
}