2016-01-02 3 views
1

Я пытаюсь использовать GZipStream с MemoryStream. Я пишу все необходимые мне байты, а затем закрываю поток gzip, после чего мне нужно получить сжатый буфер из потока памяти без выделения дополнительной памяти (метод ToArray возвращает необходимый массив байтов, но он создает новый массив байтов, а затем копирует все байты из буфера в новый массив). Насколько я понимаю, я могу использовать GetBuffer(), который возвращает весь буфер, поэтому в этом случае у меня есть еще один вопрос: Верно ли, что все нулевые байты в конце буфера не относятся к сжатым данным? Другими словами, можно ли использовать GetBuffer с предположением, что сжатый буфер заканчивается последним ненулевым байтом?Возможно ли получить длину замкнутого потока памяти?

Также во многих случаях я могу использовать Length of MemoryStream перед закрытием потока GZip и просто добавить 10 к нему после того, как поток GZip закрыт, это верно для всех случаев?

+1

"и просто добавить 10" играет с огнем. –

+0

Согласен, это было просто быть уверенным, спасибо! – Leo

ответ

1

Конструктор GZipStream имеет перегрузку с параметром leaveOpen.

Поэтому, когда вам нужно получить доступ к MemoryStream после закрытия GZip (и неявно, покрашенного), перейдите к этому 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() проблемы, но теперь вы можете использовать буфер с точной длиной.

+0

Спасибо! Это именно то, что мне нужно в данный момент. Я знал об этой перегрузке, но не понял, что это может помочь. – Leo

Смежные вопросы