Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с GZip

6.0K
24 июня 2009 года
Balda
79 / / 12.05.2008
Возникла проблема при разархивации данных с помощью GZipStream.
Если точнее, то данные при разархивации просто обнуляются.
Вот метод, который реализует разархивацию:
Код:
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);
}


Есть некая уверенность в том что обнуление происходит в этой строке:
 
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length);


Как можно по другому загнать данные из потока GZipStream в MemoryStream?
46K
24 июня 2009 года
flame_max
23 / / 09.04.2009
немного не в тему но что означает Ваш параметр
>long size
неужели вы заранее знаете какого размера будет разархивированный фрагмент ?
12K
24 июня 2009 года
lifs
163 / / 06.09.2007
Как-то так (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);
6.0K
25 июня 2009 года
Balda
79 / / 12.05.2008
Всё равно обнуляет...
Кстати, аналогичная проблема была и с MemoryStream, но тогда удалось обойти это так:
 
Код:
MemoryStream ms = new MemoryStream();
byte[] v = new byte[ms.Length];
v = ms.ToArray();


А вот GZipStream метод ToArray не поддерживает...
12K
25 июня 2009 года
lifs
163 / / 06.09.2007
Цитата: Balda
Всё равно обнуляет...
Кстати, аналогичная проблема была и с MemoryStream, но тогда удалось обойти это так:
 
Код:
MemoryStream ms = new MemoryStream();
byte[] v = new byte[ms.Length];
v = ms.ToArray();


А вот GZipStream метод ToArray не поддерживает...



Какие данные обнуляются?

В приведенном выше примере я забыл добавить третий параметр в конструкторе GZipStream, означающий, что MemoryStream останется открытым после закрытия GZipStream. Если его поставить, то у MemoryStream позже,например, можно будет вызвать ToArray.

6.0K
25 июня 2009 года
Balda
79 / / 12.05.2008
Цитата: lifs
Какие данные обнуляются?



Вот здесь

 
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)

Буфер имеет нужную длину, но данные из потока в него не записываются.

Цитата:

В приведенном выше примере я забыл добавить третий параметр в конструкторе GZipStream, означающий, что MemoryStream останется открытым после закрытия GZipStream. Если его поставить, то у MemoryStream позже,например, можно будет вызвать ToArray.



Но ведь MemoryStream содержит заархивированные данные и его десериализация ни к чему не приведет. Или я чего-то не понимаю? )

12K
25 июня 2009 года
lifs
163 / / 06.09.2007
Цитата: Balda
Вот здесь
 
Код:
zipStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)

Буфер имеет нужную длину, но данные из потока в него не записываются.



А в потоке GZipStream есть данные? Приведенный мною код рабочий.

Цитата: Balda
Но ведь MemoryStream содержит заархивированные данные и его десериализация ни к чему не приведет. Или я чего-то не понимаю? )


Десериализация здесь не причем. После закрытия потока с ним нельзя работать. Будет генерироваться исключение.

6.0K
25 июня 2009 года
Balda
79 / / 12.05.2008
Да, в потоке zipStream данные есть.
Но метод Read не записывает их в буфер.
12K
25 июня 2009 года
lifs
163 / / 06.09.2007
И число прочитанных байт он возвращает 0? И длина буфера > 0?
6.0K
25 июня 2009 года
Balda
79 / / 12.05.2008
С длинной всё в порядке. )
Буфер получается нужного размера, но пустой.
12K
25 июня 2009 года
lifs
163 / / 06.09.2007
Так какое число возвращает метод Read? Если 0, то ошибка в вызывающем коде и/или передаваемых данных.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог