【问题标题】:GZipStream does not decompress data correctlyGZipStream 无法正确解压缩数据
【发布时间】:2019-08-09 09:59:49
【问题描述】:

我正在尝试使用 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是否无法解压自己压缩的流?还是我做错了什么?

【问题讨论】:

    标签: c# gzip


    【解决方案1】:

    来自GZipStream.Flush的文档:

    此方法的当前实现不刷新内部缓冲区。释放对象时会刷新内部缓冲区。

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

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

    【讨论】:

    • 有趣。似乎异步版本FlushAsync 确实清除了缓冲区。
    • @Magnus 真的吗? GZipStream 没有实现 FlushAsync,这意味着我们应该回退到 Stream 的实现,它只是在 Task.Run 中调用 Flush
    • @Magnus Aha,“适用于:.NET Core 3.0 Preview 7”。我在看框架版本。看起来像fixed GZipStream.Flush as well in .NET Core
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多