LINUX.ORG.RU

Распаковка zip-файла с использованием zlib


0

1

ну задам уже и сдесь...

Мне понадобилось программно создавать zip-архивы в которых лежали бы файлы с разной степенью сжатия.
Ни одна из библиотек которые доступны моему пониманию этого не позволяла :)
В результате я решил работать с форматом файла вручную.

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

То что программа корректно путешествует по архиву и распознаёт имена фйайлов, говорит о том что я всё делаю верно...

Но теперь возникла проблема.
Содержимое секции с файлом не распаковывается с помощью zlib uncompress.
Я доставал содержимое в файл и пытался воспользоваться ZFile * gz = gzopen(...) - не получается.
На выходе распаковщика неизменно мусор.

Как zlib-ом распаковать файлы?

З.Ы. того что в minizip неосилил - слишком сложно, мне бы по рабоче-крестьянски.

З.Ы.Ы ну или посоветуйте простую в использовании библиотеку, которая позволяет создавать zip-архив в котором файлы с разным сжатием.


Тебе именно на Си? А то в Питоне есть уже готовые библиотеки (на крайний случай можешь посмотреть как там делается).

pacify ★★★★★ ()
Ответ на: комментарий от pacify

Тебе именно на Си?

Да.

А то в Питоне есть уже готовые библиотеки (на крайний случай можешь посмотреть как там делается).

В Питоне уже сделал... года два назад :) Теперь нужно всё переписать на C. (в питоньих исходниках за горами обёрток ничего не понятно)

Си/Си++ осознанно занимаюсь чуть меньше года - нужно ОЧЕНЬ по рабоче-крестьянски :)

knkd ()
Ответ на: комментарий от knkd

а libarchive?

а libarchive не позволяет регулировать степень сжатия при создании архива?
Непонятно...

knkd ()

> Распаковка zip-файла с использованием zlib

боже, какая прелесть… а с libzip что не так?

arsi ★★★★★ ()
Ответ на: комментарий от arsi

raise(SIGSEGV);

З.Ы.Ы ну или посоветуйте простую в использовании библиотеку, которая позволяет создавать zip-архив в котором файлы с разным сжатием.

Если использовать стороннюю библиотеку - то она должна и совать и высовывать. Бо если запаковывать придётся ручками, то распаковывать лучше тоже ручками.

Я начал с распаковки...

knkd ()

Не ту функцию дергаешь. Надо или inflateInit2 + inflate, или inflateBack. Тебе же сырые данные распаковать надо, без всяких заголовков.

nanonymous ()
Ответ на: комментарий от nanonymous

Тебе же сырые данные распаковать надо, без всяких заголовков.

Опа... Я не знал что есть разница.
Спасибо, попробую.

knkd ()

Позырь здесь: http://osdab.42cows.org/snippets/zip.php?mode=advanced

В сами исходники не заглядывал, поддерживается ли запись файлов с разной степенью сжатия тоже не знаю. Чиста just in case.

anonymous ()
Ответ на: комментарий от knkd

Белки, или зайцы... кого в космос пускали, собак чтоли?

:)

mrs ()

во первых, надо идти и читать описание формата ZIP (файл APPNOTE.TXT) в котором все описано... если используется deflate (а это только один из методов упаковки), то данные должны лежать без gz заголовка - для этого надо звать inflateInit2 с флагом -MAX_WBITS и затем звать inflate пока не кончатся данные.

Кроме того, не стоит забыват, что в Zip-файле данные могут быть в других форматах сжатия - bz2, lzma, ppmd, deflate64, shrink... Я бы перестал изобретать велосипед, и взял бы libzip - она из существующих одна из самых навороченных

И честно говоря, я не совсем понял задачу - зачем нужны разные степени сжатия?

ott ★★★★★ ()
Ответ на: комментарий от ott

Запихивать в один архив данные, которые отлично жмутся, и данные, которые не жмутся вообще.

LamerOk ★★★★★ ()
Ответ на: комментарий от ott

И честно говоря, я не совсем понял задачу - зачем нужны разные степени сжатия?

Традиционно... Для того чтобы первый файл в архиве был несжатый. В нём сидит описание. А всё от того, что некоторую информацию об пакете должны читать старые фортрановские либы, создатели которых умерли ещё до появления формата zip :)

Я бы перестал изобретать велосипед, и взял бы libzip

Увы... :(

если используется deflate (а это только один из методов упаковки), то данные должны лежать без gz заголовка - для этого надо звать inflateInit2 с флагом -MAX_WBITS и затем звать inflate пока не кончатся данные.

Спасибо. Проверяю.

knkd ()
Ответ на: комментарий от ott

>Я бы перестал изобретать велосипед, и взял бы libzip - она из существующих одна из самых навороченных

Я, например, хотел написать открывашку файла, который представляет собой запакованные zipом текстовые данные, и тащить ради этой открывашки лишнюю библиотеку в зависимостях сильно не хотелось бы.

dn2010 ★★★★★ ()
Ответ на: комментарий от dn2010

Ну если специфических требований нет, то почему бы и нет?
libzip не такая уж и большая.
Я бы даже libarchive взял, для полной сухости и комфорта.

knkd ()
Ответ на: комментарий от knkd

У меня было ощущение, что там как-то это можно указать - сжимать или нет. В крайнем случае можно попробовать похакать исходный код

ott ★★★★★ ()
Ответ на: комментарий от dn2010

написание корректной библиотеки работы с Zip'ованными данными - дело не одного дня (даже не недели)... у меня в текущей библиотеке 2500 строк кода, не считая инфрасткрутктурных вещей). Зачем тратить свое время на то, что уже сделали другие?

ott ★★★★★ ()
Ответ на: комментарий от ott

У меня было ощущение, что там как-то это можно указать - сжимать или нет

Хорошо бы, но не найду никак...

Зачем тратить свое время на то, что уже сделали другие?

Хочу разное сжатие :( надо.

knkd ()
Ответ на: комментарий от ott

ну я имел ввиду, что бывает легче похакать существующую библиотеку, чем переписывать ее с нуля

Для первого года знакомства с C/C++ исходники слишком сложны.

knkd ()
Ответ на: комментарий от knkd

для первого года знакомства, написание эффективной распаковки/упаковки тоже может быть сложным :-)

ott ★★★★★ ()
Ответ на: комментарий от ott

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

А у меня есть выбор? :-(

Распаковка мне на самом деле и не нужна, могу воспользоваться любой из существующих библиотек.
Просто я хочу точно знать, что то что я запакую распакуется обратно :-)
Потому хочу проверить, что же там на самом деле происходит.

knkd ()
Ответ на: комментарий от knkd

ну тогда надо внимательно читать APPNOTE от unzip, RFC на deflate и документацию от zlib. Если будут вопросы, можете спрашивать по почте

ott ★★★★★ ()
Ответ на: комментарий от ott

Всё работает. Вопрос с DEFLATE полностью решен.

Спасибо, ott.

knkd ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.