2016-01-02 37 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

相關問題