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

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

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

GZipStream的构造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()vs getBuiffer()问题,但现在您可以使用具有准确长度的缓冲区。