有可能得到关闭内存流的长度吗

本文关键字:内存 有可能 | 更新日期: 2023-09-27 18:28:47

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

此外,在许多情况下,我可以在关闭GZip流之前使用Length of MemoryStream,并在关闭GZip流之后添加10,这在所有情况下都是真的吗?

有可能得到关闭内存流的长度吗

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

因此,当您需要在GZip关闭(并且隐式地,Flushed)之后访问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()的问题,但现在您可以使用具有精确长度的缓冲区。