是否有可能获得封闭内存流的长度?

Is it possible to get length of closed memory stream?

我正在尝试将 GZipStream 与 MemoryStream 一起使用。我写了我需要的所有字节然后关闭 gzip 流所以之后我需要从内存流中获取压缩缓冲区而不分配额外的内存(方法 ToArray returns 必要的字节数组但是它创建新的字节数组然后从复制所有字节缓冲到新数组中)。 据我所知,我只能使用 returns 整个缓冲区的 GetBuffer() 所以在这种情况下我还有另一个问题: 缓冲区末尾的所有零字节是否真的不属于压缩数据?换句话说,我可以使用 GetBuffer 假设压缩缓冲区以最后一个非零字节结尾吗?

此外,在许多情况下,我可以在关闭 GZip 流之前使用 MemoryStream 的长度,并在 GZip 流关闭后向其添加 10,对所有情况都是如此吗?

GZipStream 的构造函数有一个带有 leaveOpen 参数的重载。

因此,当您需要在 GZip 关闭(并隐式地刷新)后访问 MemoryStream 时,将 true 传递给它。

using (var ms = new MemoryStream())
{
    using (var gz = new GZipStream(ms, CompressionMode.Compress, leaveOpen: true))
    {
       // ... write to gz
    }
    Console.WriteLine(ms.Length);  // this is the final and accurate length
}

这仍然存在 GetArray() 与 getBuiffer() 的问题,但现在您可以使用具有准确长度的缓冲区。