Совместим ли GzipStream .NET с qCompress/qUncompress на основе zlib Qt?

Совместим ли GzipStream .NET с qCompress/qUncompress на основе zlib Qt? Я полагаю, что они оба используют алгоритм deflate, поэтому смогу ли я использовать .NET DeflateStream или GzipStream для чтения данных, записанных Qt qCompress, и записи данных, читаемых Qt qUncompress, без повторной реализации zlib полностью в .NET?


person Jake Petroules    schedule 30.12.2010    source источник


Ответы (1)


Я сомневаюсь в этом. Во-первых, qCompress() помещает размер данных в первые 4 байта, что не имеет ничего общего со стандартами zlib. Вы можете пропустить эти байты, но это грязный хак. Во-вторых, GzipStream звучит так, как будто он читает формат Gzip (формат zlib, предназначенный для сжатия файлов), когда qCompress() использует вызов compress2(), который использует другой формат zlib, предназначенный для сжатия в памяти.

qCompress() и qUncompress() предназначены для работы друг с другом и не более того. Если вам нужна совместимость с другим кодом, используйте zlib напрямую, это легко и портативно. По сути, мы так и делаем в своей компании — сервер использует Qt, клиенты — .Net и Java. Работает отлично.

person Sergei Tachenov    schedule 30.12.2010
comment
Какие реализации zlib для .NET и Java вы бы порекомендовали? Я знаю ZLIB.NET (componentace.com/zlib_.NET.htm), но как насчет Явы? Каковы стандартные библиотеки де-факто для поддержки zlib в .NET и Java? - person Jake Petroules; 30.12.2010
comment
Я использую JZlib для Java, работает нормально, только поддержка флеша несколько заторможена - надо что-то писать для сброса (и массив байтов нулевого размера не подойдет, поскольку его запись ничего не делает). Не знаю о .Net, так как я не разработчик .Net. - person Sergei Tachenov; 30.12.2010
comment
В качестве примечания: я обнаружил, что ZLIB.NET совместим с qCompress/qUncompress. DeflateStream и GzipStream в .NET — нет. Однако не забудьте добавить и удалить первые 4 байта, указав несжатую длину при сжатии и распаковке. - person Jake Petroules; 14.06.2011
comment
Спустя годы я столкнулся с той же проблемой. Интеграция комментария @JakePetroules с этим article я обнаружил, почему DeflateStream несовместим напрямую: первые два символа. Таким образом, вы определенно можете использовать DeflateStream .NET, при условии, что вы отбросите первые ШЕСТЬ байтов из массива (четыре с длиной плюс 2 с заголовком zlib). Протестировано с использованием QT 5.7.0 и VS2015 с .NET 4.5.2. - person frarugi87; 05.12.2016