Подтвердить что ты не робот

Класс GZipStream или DeflateStream?

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

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

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

4b9b3361

Ответ 1

Дефлат - это просто алгоритм сжатия. GZip - фактически формат.

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

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

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

Ответ 2

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

Ответ 3

Ну, я был совершенно не прав в своем первом ответе. Я просмотрел исходный код 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. Это, конечно, не ответ на ваш вопрос, но, возможно, это поможет немного.

Ответ 4

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

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

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

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

Ответ 5

В то время как 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();
            }
        }