«Синхронный сброс» для Zlib Deflate - PullRequest
4 голосов
/ 28 ноября 2010

Мне нужен сжатый поток zlib deflate. В моей реализации я должен использовать один поток на протяжении всей сессии. во время этого сеанса небольшие куски данных будут передаваться через сжатый поток. Каждый раз, когда передается чанк, он должен быть немедленно отправлен в сжатом виде.

Моя первая попытка была с использованием DeflateStream, но когда я отправляю первый блок, его сжатые данные не будут появляться, пока я не закрою поток.

Чтение о режимах zlib flush кажется, что есть один конкретный режим для того, что мне нужно.

  1. Использую ли я правильный класс (DeflateStream) для сжатия zlib deflate?
  2. Как включить поведение "синхронная очистка"?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

Проект DotNetZip имеет подмодуль Zlib, который содержит собственную реализацию DeflateStream.

Эта реализация имеет другое свойство с именем FlushMode:

DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress);
deflate.FlushMode = FlushType.Sync;
deflate.Write (data, 0, data.Length);
//No call to deflate.Flush() needed, automatically flushed on every write.
0 голосов
/ 17 марта 2017

Чтобы ответить на ваш вопрос о том, как вы можете включить поведение «синхронной очистки», вы должны увидеть пример zpipe.c в исходном коде zlib.
Заменить 1-ю строку на 2-ю строку, показанную ниже

Deflate() будет возвращаться каждый раз, когда выходной буфер заполнен или когда входной буфер пуст, в то же время добавляя к сжатому потоку пустой литеральный блок, также называемый «сброс синхронизации», за исключением конца, который является флагом Z_FINISH.

    flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
    flush = feof(source) ? Z_FINISH : Z_SYNC_FLUSH;
    ret = deflate(&strm, flush);
0 голосов
/ 28 ноября 2010

Это действительно только прилив близко.Вам нужно будет каждый раз использовать другой экземпляр DeflateStream, передавая true перегруженному конструктору , сообщая ему не , чтобы закрыть базовый потоккогда вы закрываете DeflateStream.

...