Хорошая реализация zlib в .NET? - PullRequest
7 голосов
/ 04 февраля 2009

Я создаю сетевое приложение, которое должно иметь возможность переключаться с обычного сетевого трафика на сжатый поток zlib , средний поток. Мои мысли по этому вопросу связаны с логическим переключателем, который при включении заставит сетевой код передать все данные через класс, в который я могу передать IEnumerable<byte>, а затем извлечь распакованный поток, передав его в уже существующий анализ протокола. код.

Вещи, на которые я смотрел:

  • ZLib.NET - Кажется, немного ... Эклектично, и не совсем то, что я хочу. Тем не менее, все равно неплохо бы начать строить. ( комментарии Джона Скита здесь вряд ли меня тоже вдохновят.)
  • SharpZipLib - Кажется, это вообще не поддерживает zlib? Кто-нибудь может подтвердить или опровергнуть это?

Я бы очень предпочел и все управляемые решения, но давайте посмотрим ... есть ли другие реализации этой библиотеки в .NET, которые могли бы лучше подходить для того, что я хочу сделать, или я должен взять ZLib.NET и собрать его как начало?

PS:

Джона попросили более подробно, так что вот оно.

Я пытаюсь реализовать MCCP 2 . Это включает в себя отправку сигнала в сетевом потоке, и все, что следует за этим сигналом, является сжатым потоком данных zlib. В приведенной выше ссылке есть ссылки на то, что они имеют в виду. В любом случае, чтобы было ясно, я на этом получаю конец (клиент, а не сервер), и у меня уже есть куча данных, считанных из сетевого потока, и переключение будет в середине этого (во всех как минимум вероятность), поэтому любое решение должно иметь возможность вводить в него некоторые дополнительные данные, прежде чем оно захватит NetworkStream (или я вручную добавлю остальные данные).

Ответы [ 5 ]

3 голосов
/ 06 марта 2009

В DotNetZip имеется ZlibStream для сжатия или распаковки потоков данных zlib. Вы не спрашивали, но есть также GZipStream и DeflateStream. Как и класс ZlibCodec, если это ваша вещь. (просто надувает или спускает буферы, в отличие от потоков).

DotNetZip - это полностью управляемая библиотека с либеральной лицензией. Вам не нужно использовать какую-либо возможность .zip для доступа к материалам Zlib. А для этой цели zlib упаковывается как отдельная (меньшая) DLL.

3 голосов
/ 04 февраля 2009

SharpZipLib поддерживает ZLib. Посмотри в FAQ .

Кроме того, вы проверили, поддерживает ли пространство имен System.IO.Compression то, что вам нужно?

Я бы не использовал IEnumerable<byte>, хотя - потоки предназначены для объединения в цепочку.

РЕДАКТИРОВАТЬ: Хорошо ... похоже, вам нужен поток, который поддерживает буферизацию, но с большим контролем, чем обеспечивает BufferedStream. Вам нужно было бы «перемотать» поток, если вы увидели переключатель декомпрессии, а затем создать GZipStream поверх него. Ваш буфер должен быть по крайней мере таким же большим, как ваш самый большой вызов Read (), чтобы у вас всегда было достаточно буфера для перемотки.

2 голосов
/ 04 февраля 2009

Принимает ли ответ в этом посте: Zlib-совместимые потоки сжатия , вам вообще поможет?

0 голосов
/ 05 февраля 2009

Насколько я знаю, библиотека ZLib (gzip) не поддерживает перечисление файлов в заголовке. Предполагая, что это важно для вас, но это кажется большим недостатком. Это было, когда я недавно использовал библиотеку sharp zip, поэтому я хочу удалить это:)

0 голосов
/ 04 февраля 2009

Я могу порекомендовать вам оболочку zlib Джерри Шоу для .NET:

http://www.organicbit.com/zip/

...