Одна библиотека для deflate, gzip и zlib в .net - PullRequest
4 голосов
/ 10 сентября 2010

Во-первых, давайте определим некоторые обычно запутанные термины:

deflate = compression_algorithm;
zlib = header + deflate + trailer;
gzip = header + deflate + trailer;

Я ищу библиотеку, которая в основном позволит мне сделать следующее:

if(method == "gzip"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.GZIP);
}
else if(method == "deflate"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.DEFLATE);
}
else if(method == "zlib"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.ZLIB);
}

Я ищудля способа сравнительного тестирования 3 форматов сжатия для использования в Интернете.Я хотел бы, чтобы algorthims сжатия deflate для каждого формата были одинаковой точной реализацией.Я уже взломал zlib.net, чтобы заставить его давать мне сырой дефлат по команде (через «недокументированную функцию») ... однако, добавление заголовка gzip и трейлера немного не в моей лиге.

Кто-нибудь знает библиотеку .net, которая это делает?


Уточнение:

HTTP 1.1 deflate сжатие format - это формат сжатия zlib .Zlib - это обертка вокруг дефлата;он имеет 2-байтовый заголовок и 4-байтовый трейлер, всегда (когда методы и уровни сжатия идентичны).

Gzip использует один и тот же формат сжатых данных внутрикак zlib ... который является deflate (необработанный deflate, а не HTTP 1.1 deflate [который является zlib]).По моим собственным предварительным испытаниям данные в сжатом формате в 11 из 12 раз больше, чем zlib.

deflate - алгоритм сжатия, который используется для сжатия данных.Когда нет никаких методов-оберток (например, заголовков или трейлеров) вокруг дефлированных данных, я называю это «deflate» - возможно, мне следовало бы назвать это «raw deflate» .

Яанализ этих методов сжатия и их поддержки в веб-браузерах, и необходимо использовать один метод сжатия для всех трех типов.

Ответы [ 2 ]

3 голосов
/ 11 сентября 2010

Основываясь на чтении документов по стандартам и работе, которую я проделал с zlib, реализациями .NET gzip и deflate и несколькими другими пакетами сжатия для .NET, я определил:

1) «raw deflate» всегда меньше, чем то, что вы называете «HTTP 1.1 deflate», что всегда меньше, чем gzip.Предполагая, что вы использовали одну и ту же библиотеку для генерации всех трех.То есть для любой конкретной библиотеки сжатия deflate

2) Различия в размерах очень малы.Разница между deflate и zlib обычно составляет всего несколько байтов.Разница между deflate и gzip составляет не более нескольких десятков байт.Это верно независимо от размера файла.

3) Различные реализации deflate имеют сильно различающиеся коэффициенты сжатия и время выполнения.Например, реализация zlib обеспечивает лучшее сжатие и более быстрое выполнение, чем реализация .NET 3.5.

4) Взаимодействие между различными реализациями составляет почти 100%.Таким образом, файл deflate (или gzip), созданный одной библиотекой, может быть распакован любой другой библиотекой.Я слышал о случаях, когда это не так, но я не смог его создать.

5) Из-за вычисления CRC создание gzip занимает значительно больше времени, чем zlib.

Я не знаю библиотеки C #, которая позволяла бы вам генерировать файл zlib или gzip, учитывая необработанные данные deflate, но вы должны быть в состоянии создать их довольно легко, если вы изучите документы стандартов.

IТакже не знаю ни одного браузера, который поддерживает «сырой дефлат».Но тогда я не могу сказать, что я действительно попробовал это.Я всегда использовал «HTTP 1.1 deflate».

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

DotNetZip делает RFC 1950 (ZLIB) , RFC 1951 (DEFLATE) и RFC 1952 (GZIP) . Он использует один и тот же базовый механизм сжатия для всех трех.

DotNetZip также делает ZIP-файлы.

...