public static MemoryStream Decompress(MemoryStream ZippedData, long size)
{
byte[] decompressedBuffer = new byte[size];
MemoryStream decompressedStream = new MemoryStream();
ZippedData.Position = 0;
GZipStream zipStream = new GZipStream(ZippedData, CompressionMode.Decompress);
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
zipStream.Close();
decompressedStream.Write(decompressedBuffer, 0, decompressedBuffer.Length);
return (decompressedStream);
}
Работа с GZip
Если точнее, то данные при разархивации просто обнуляются.
Вот метод, который реализует разархивацию:
Код:
Есть некая уверенность в том что обнуление происходит в этой строке:
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
Как можно по другому загнать данные из потока GZipStream в MemoryStream?
>long size
неужели вы заранее знаете какого размера будет разархивированный фрагмент ?
Код:
byte[] decompressedBuffer = new byte[size];
MemoryStream decompressedStream = new MemoryStream();
ZippedData.Position = 0;
using (GZipStream zipStream = new GZipStream(ZippedData,
CompressionMode.Decompress, true))
{
int length;
while ((length = zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)) > 0)
decompressedStream.Write(decompressedBuffer, 0, length);
}
return (decompressedStream);
MemoryStream decompressedStream = new MemoryStream();
ZippedData.Position = 0;
using (GZipStream zipStream = new GZipStream(ZippedData,
CompressionMode.Decompress, true))
{
int length;
while ((length = zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)) > 0)
decompressedStream.Write(decompressedBuffer, 0, length);
}
return (decompressedStream);
Кстати, аналогичная проблема была и с MemoryStream, но тогда удалось обойти это так:
Код:
MemoryStream ms = new MemoryStream();
byte[] v = new byte[ms.Length];
v = ms.ToArray();
byte[] v = new byte[ms.Length];
v = ms.ToArray();
А вот GZipStream метод ToArray не поддерживает...
Цитата: Balda
Всё равно обнуляет...
Кстати, аналогичная проблема была и с MemoryStream, но тогда удалось обойти это так:
А вот GZipStream метод ToArray не поддерживает...
Кстати, аналогичная проблема была и с MemoryStream, но тогда удалось обойти это так:
Код:
MemoryStream ms = new MemoryStream();
byte[] v = new byte[ms.Length];
v = ms.ToArray();
byte[] v = new byte[ms.Length];
v = ms.ToArray();
А вот GZipStream метод ToArray не поддерживает...
Какие данные обнуляются?
В приведенном выше примере я забыл добавить третий параметр в конструкторе GZipStream, означающий, что MemoryStream останется открытым после закрытия GZipStream. Если его поставить, то у MemoryStream позже,например, можно будет вызвать ToArray.
Цитата: lifs
Какие данные обнуляются?
Вот здесь
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)
Буфер имеет нужную длину, но данные из потока в него не записываются.
Цитата:
В приведенном выше примере я забыл добавить третий параметр в конструкторе GZipStream, означающий, что MemoryStream останется открытым после закрытия GZipStream. Если его поставить, то у MemoryStream позже,например, можно будет вызвать ToArray.
Но ведь MemoryStream содержит заархивированные данные и его десериализация ни к чему не приведет. Или я чего-то не понимаю? )
Цитата: Balda
Вот здесь
Буфер имеет нужную длину, но данные из потока в него не записываются.
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)
Буфер имеет нужную длину, но данные из потока в него не записываются.
А в потоке GZipStream есть данные? Приведенный мною код рабочий.
Цитата: Balda
Но ведь MemoryStream содержит заархивированные данные и его десериализация ни к чему не приведет. Или я чего-то не понимаю? )
Десериализация здесь не причем. После закрытия потока с ним нельзя работать. Будет генерироваться исключение.
Но метод Read не записывает их в буфер.
И число прочитанных байт он возвращает 0? И длина буфера > 0?
Буфер получается нужного размера, но пустой.
Так какое число возвращает метод Read? Если 0, то ошибка в вызывающем коде и/или передаваемых данных.