2016-01-02 36 views
1

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

同样在很多情况下,我可以在关闭GZip流之前使用MemoryStream的长度,并且在GZip流关闭后只需添加10即可适用于所有情况?

+1

“刚刚加10”正在玩火。 –

+0

我同意,这只是可以肯定的,谢谢! – Leo

回答

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()VS getBuiffer()的问题,但现在你可以使用缓冲区的准确长度。

+0

谢谢!这正是我目前需要的。我知道这种超载,但没有发现它可以帮助。 – Leo

相关问题