C# GZipStream无法正确解压缩数据
我正在尝试用GZipStream压缩数据。代码非常简单:C# GZipStream无法正确解压缩数据,c#,gzip,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.Comp
// 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
是否无法解压缩自身压缩的流?还是我做错了什么?来自以下文件:
此方法的当前实现不会刷新内部缓冲区。当对象被释放时,内部缓冲区被刷新
这与写入ms2
的数据不足相适应。尝试使用块在中包装zipStream
:
var ms2 = new MemoryStream();
using (GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress))
{
ms.CopyTo(zipStream);
}
有趣。似乎异步版本FlushAsync
确实清除了缓冲区。@Magnus真的吗?GZipStream没有实现FlushAsync,这意味着我们应该回到Stream的实现,它只在任务中调用Flush。Run
@Magnus Aha,“适用于:.NET Core 3.0预览7”。我在看框架版本。看起来像