GZipStream или класс DeflateStream? - PullRequest
51 голосов
/ 08 апреля 2010

Документация MSDN сообщает мне следующее:

Класс GZipStream использует gzip формат данных, который включает в себя циклический значение проверки избыточности для обнаружения повреждение данных. Формат данных gzip использует тот же алгоритм сжатия, что и класс DeflateStream.

Кажется, GZipStream добавляет некоторые дополнительные данные в вывод (относительно DeflateStream). Мне интересно, в каком типе сценария было бы важно использовать GZipStream, а не DeflateStream?

Ответы [ 5 ]

70 голосов
/ 08 апреля 2010

Deflate - это просто алгоритм сжатия.GZip на самом деле является форматом.

Если вы используете GZipStream для сжатия файла (и сохраняете его с расширением .gz), результат может быть действительно открыт архиваторами, такими как WinZip или gzip инструмент.Если вы сжимаете DeflateStream, эти инструменты не распознают файл.

Если сжатый файл предназначен для открытия этими инструментами, тогда необходимо использовать GZipStream вместо DeflateStream.

Я также считаю важным, если вы передаете большой объем данных через ненадежный носитель (например, подключение к Интернету) и не используете протокол с исправлением ошибок, такой как TCP / IP.Например, вы можете передавать через последовательный порт, необработанный сокет или UDP.В этом случае вам определенно понадобится информация CRC, встроенная в формат GZip, чтобы убедиться, что данные верны.

11 голосов
/ 15 ноября 2011

GZipStream - это то же самое, что и DeflateStream, но он добавляет CRC, чтобы гарантировать отсутствие ошибок в данных.

5 голосов
/ 08 апреля 2010

Ну, я был совершенно неправ в своем первом ответе. Я посмотрел в исходном коде Mono и обнаружил, что класс GZipStream фактически перенаправляет свои вызовы чтения / записи (и почти любые другие) на соответствующие вызовы методов внутреннего объекта DeflateStream:

public override int Read (byte[] dest, int dest_offset, int count)
{
    return deflateStream.Read(dest, dest_offset, count);
}

public override void Write (byte[] src, int src_offset, int count)
{
    deflateStream.Write (src, src_offset, count);
}

Единственное отличие состоит в том, что он всегда создает объект DeflateStream с флагом gzip, установленным в true. Это, конечно, не ответ на ваш вопрос, но, возможно, это немного поможет.

2 голосов
/ 30 апреля 2014

Дито по Ааронау

Обратите внимание на еще одно важное отличие согласно
http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12:

Я измерил DeflateStream на 41% быстрее, чем GZip.

Я не измерял скорость, но я измерил размер файла, равный appx. то же самое.

1 голос
/ 29 марта 2016

Хотя GZipStream, кажется, использует DeflateStream для выполнения декомпрессии, эти два алгоритма не кажутся взаимозаменяемыми.Следующий тестовый код даст вам исключение:

        MemoryStream wtt=new MemoryStream();
        using (var gs=new GZipStream(wtt,CompressionMode.Compress,true))
        {
            using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true))
            {
                sw.WriteLine("Hello");
            }
        }
        wtt.Position = 0;
        using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true))
        {
            using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true))
            {
                var txt = sr.ReadLine();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...