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

Zlib-совместимые потоки сжатия?

Являются ли System.IO.Compression.GZipStream или System.IO.Compression.Deflate совместимыми с сжатием zlib?

4b9b3361

Ответ 1

Из MSDN о System.IO.Compression.GZipStream:

Этот класс представляет формат данных gzip, который использует стандартный алгоритм для сжатия и декомпрессии без потерь.

Из zlib FAQ:

Функции gz * в zlib, с другой стороны, используют формат gzip.

Итак, zlib и GZipStream должны взаимодействовать, но только если вы используете функции zlib для обработки формата gzip.

System.IO.Compression.Deflate и zlib, как сообщается, не совместимы.

Если вам нужно обрабатывать zip файлы (вероятно, нет, но кому-то это может понадобиться), вам нужно использовать SharpZipLib или другую стороннюю библиотеку.

Ответ 2

DotNetZip включает в себя DeflateStream, ZlibStream и GZipStream для обработки RFC 1950, 1951 и 1952. Все используют Алгоритм DEFLATE, но байты кадрирования и заголовка различны для каждого из них.

В качестве преимущества потоки в DotNetZip не отображают анонимность расширения размера данных

Ответ 3

Я столкнулся с этой проблемой с объектами Git. В этом конкретном случае они хранят объекты как дефлированные капли с заголовком Zlib, который задокументирован в RFC 1950. Вы можете сделать совместимый blob, создав файл, который содержит:

  • Два байта заголовка (CMF и FLG из RFC 1950) со значениями 0x78 0x01
    • CM= 8 = deflate
    • CINFO= 7 = 32Kb окно
    • FCHECK= 1 = контрольные суммы для этого заголовка
  • Выход С# DeflateStream
  • Контрольная сумма Adler32 входных данных в формат DeflateStream, в формате big-endian (сначала MSB)

Я сделал свою собственную реализацию Adler

public class Adler32Computer
{
    private int a = 1;
    private int b = 0;

    public int Checksum
    {
        get
        {
            return ((b * 65536) + a);
        }
    }

    private static readonly int Modulus = 65521;

    public void Update(byte[] data, int offset, int length)
    {
        for (int counter = 0; counter < length; ++counter)
        {
            a = (a + (data[offset + counter])) % Modulus;
            b = (b + a) % Modulus;
        }
    }
}

И это было в значительной степени.

Ответ 4

Я использовал GZipStream для сжатия вывода из .NET XmlSerializer, и он отлично справился с распаковкой результата с помощью gunzip (в cygwin), winzip и другого GZipStream.

Для справки, вот что я сделал в коде:

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress))
{
  XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
  serializer.Serialize(gzStream, myData);
}

Затем, чтобы распаковать в С#

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
using (Stream input = new GZipStream(fs, CompressionMode.Decompress))
{
   XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
   myData = (MyDataType) serializer.Deserialize(input);
}

Использование утилиты "file" в cygwin показывает, что действительно существует разница между тем же файлом, сжатым с помощью GZipStream, и с GNU GZip (вероятно, информация заголовка, как указано другими в этом потоке). Однако это различие, по-видимому, практически не имеет значения.

Ответ 5

gzip deflate + некоторые данные заголовка/нижнего колонтитула, такие как контрольная сумма и длина и т.д. Таким образом, они несовместимы в том смысле, что один метод может использовать поток из другого, но они используют один и тот же алгоритм сжатия.

Ответ 6

Они просто сжимают данные с помощью алгоритмов zlib или deflate, но не предоставляют вывод для определенного формата файла. Это означает, что если вы храните поток как есть на жестком диске, скорее всего, вы не сможете его открыть с помощью какого-либо приложения (gzip или winrar), поскольку заголовки файлов (магическое число и т.д.) Не включены в поток, и вы должны пишите их сами.

Ответ 7

Начиная с .NET Framework 4.5, класс System.IO.Compression.DeflateStream использует библиотеку zlib.

Из класса Статья MSDN:

Этот класс представляет алгоритм Deflate, который является отраслевым стандартом для сжатия и декомпрессии без потерь. Начиная с .NET Framework 4.5, класс DeflateStream использует библиотеку zlib. В результате он обеспечивает лучший алгоритм сжатия и, в большинстве случаев, меньший сжатый файл, чем он предлагает в более ранних версиях .NET Framework.

Ответ 8

Я согласен с andreas. Вероятно, вы не сможете открыть файл во внешнем инструменте, но если этот инструмент ожидает поток, вы можете его использовать. Вы также сможете сфотографировать файл с использованием того же класса сжатия.