2011-06-30 3 views
2

Имея странную проблему - один из моих приложений-аплетов должен читать/записывать gzip-сжатые файлы, которые используются как для Windows, так и для Linux, и я обнаружил, что файлы, которые я генерирую с использованием zlib в Linux, в 2-3 раза больше, чем те, которые я генерирую, используя GZipStream в Windows. Они отлично читаются на обеих платформах, поэтому я знаю, что сжатие правильное, независимо от того, какая платформа создала файл. Дело в том, что файлы передаются по сети в разное время, и, очевидно, размер файла является проблемой.В чем разница между сжатием gzip zlib и сжатием, используемым GZipStream .NET?

Мой вопрос:

  1. Кто-нибудь еще сталкивался с такой
  2. Есть некоторые документально разница между этими двумя? Я знаю, что GZipStream не предоставляет способ указать уровень сжатия, как вы можете, с zlib, но я использую максимальное сжатие на стороне zlib. Разве я не должен видеть относительно тот же размер файла, предполагая, что GZipStream написан для использования максимального сжатия?
+0

Для уточнения того, что сжимается, является (по существу) один монолитный файл, используя формат gzip, используя deflateInit2() с Z_BEST_COMPRESSION, Z_DEFLATED, 16 + MAX_WBITS и Z_DEFAULT_STRATEGY. – Will

+0

Вы не можете указать уровень сжатия для GZipStream. Это точно не похоже на то, что вы хотите, если они в 3 раза меньше :) –

+0

Точно ... проблема на стороне Linux. Некоторое время ломал голову над этим, и, наконец, решил бросить это на SO гуру и посмотреть, есть ли у них какие-либо идеи. – Will

ответ

1

И ответ ... версия Linux никогда не сжимала данные для начала. Взял много отладки, чтобы найти ошибку, вызвавшую ее, но после ее исправления размеры теперь сопоставимы на обеих платформах.

1

Я думаю, причина в том, что вы испытываете это не из-за используемого алгоритма сжатия, а из-за сжатия файлов. Из инструкции ZLIB:.

«Формат Zlib был разработан, чтобы быть компактными и быстрыми для использования в памяти и по каналам связи в формате GZIP был разработан для одинарного сжатия файлов на файловых системах, имеет больший заголовок, чем zlib для сохранения информации о директории и использует другой, более медленный метод проверки, чем zlib. "

Я думаю, что происходит то, что файлы на вашей Linux-машине Tar'red вместе в 1 файл, затем этот файл сжимается. В WIndows я думаю, что он сжимает каждый отдельный файл, а затем сохраняет их в 1 файл.

Это моя теория, но ей нечего реально поддерживать. Думал, что позже я смогу попробовать пробные тесты дома, чтобы заполнить мое любопытство.

+0

Я бы наклонился к этому, за исключением того, что знаю, что сжат только один файл. У меня есть собственный формат архива, который я использую; архив создается, весь архив сжимается как один файл, а затем результат зашифровывается. Тот же процесс на обеих платформах. – Will

+0

@Will - Так много для моей теории. Я проведу несколько тестов и посмотрю, не могу ли я понять, что происходит. У меня есть Linux на виртуальной машине VMWare, поэтому я увижу, не могу ли я понять, что происходит, и изменить свой ответ. – Icemanind

+0

благодарит за вашу помощь. Я пробовал различные комбинации, и ничего не приближается к результатам, которые я получаю на стороне .NET. Очень странно для меня, особенно зная, как долго zlib был вокруг. – Will

Смежные вопросы