我正在尝试将GZipStream与MemoryStream一起使用。我写了我需要的所有字节,然后关闭gzip流,所以在那之后我需要从内存流中获取压缩缓冲区而不分配额外的内存(方法ToArray返回必要的字节数组但是它创建新的字节数组然后将所有字节从缓冲区复制到新的数组)。 据我所知,我只能使用返回整个缓冲区的GetBuffer(),所以在这种情况下我还有另一个问题: 是否真的是缓冲区末尾的所有零字节都不属于压缩数据?换句话说,我可以使用GetBuffer假设压缩缓冲区以最后一个非零字节结束吗?
同样在很多情况下,我可以在关闭GZip流之前使用Length of MemoryStream,只需在GZip流关闭后添加10就适用于所有情况?
答案 0 :(得分:1)
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()问题,但现在您可以使用具有准确长度的缓冲区。