Воскресенье, 17 Ноября 2024, 23:44

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Распаковка данных zlib
kalumbДата: Среда, 19 Августа 2015, 21:16 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здравствуйте!
Мне нужно распаковать данные, сжатые zlib. Как можно узнать размер распакованных данных? Ведь в C нужно заранее выделять память.
В Python это проще сделать: a = zlib.decompress(data_zlib), в Си дело обстоит иначе.
Также хочу отметить, что я работаю не с архивами, где размер распакованных данных вроде как указан.
PATCH1Дата: Среда, 19 Августа 2015, 22:07 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Цитата kalumb ()
Как можно узнать размер распакованных данных?

Чтобы узнать размер папки со всеми ее файлами и подкаталогами (размер распакованных данных), можно воспользоваться следующим кодом:
kalumbДата: Среда, 19 Августа 2015, 23:18 | Сообщение # 3
почетный гость
Сейчас нет на сайте
PATCH1, что-то я не очень понял, при чём тут папки и каталоги? Наверное, вы меня не так поняли. Попытаюсь объяснить свою ситуацию.
Есть файл test.dat. В нём записана следующая информация: 4 байта - размер сжатых данных, дальше - данные сжатые zlib.
Мне нужно распаковать эти данные, но я не знаю размер, который у меня получится после распаковки. А он мне нужен для выделения памяти.
SaiteiДата: Четверг, 20 Августа 2015, 13:01 | Сообщение # 4
старожил
Сейчас нет на сайте
kalumb, скорее всего тебе придется прямо в файле указать размер распакованных данных
kalumbДата: Четверг, 20 Августа 2015, 17:00 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Saitei, я не могу этого сделать. Это посторонние файлы, которые мне нужно распаковать. У меня уже есть распаковщик на Python, но я хотел попробовать на C переписать. Уже весь нет облазил, ничего толкового не нашёл...
ArchidoДата: Четверг, 20 Августа 2015, 17:29 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Ну а как ты его тогда узнать то собираешься? Посмотри какие коды ошибок эта функция может возвращать... там есть такой, который говорит, что размер буфера недостаточен. Собственно, в большинстве случаев compression ratio не превышает 100%, поэтому просто берешь размер упакованного файла, помноженный на 2 и пытаешься распаковать. Если тебе говорят, что не влезает, то снова умножаешь на 2 и так пока не влезет.

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
kalumbДата: Четверг, 20 Августа 2015, 18:00 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Archido, то есть всё это загнать в while или сделать рекурсию, и просто увеличивать память? В принципе, я так и собирался сделать, просто думал есть более лучшее решение. Но всё равно спасибо!
SaiteiДата: Четверг, 20 Августа 2015, 20:57 | Сообщение # 8
старожил
Сейчас нет на сайте
Цитата kalumb ()
Archido, то есть всё это загнать в while или сделать рекурсию, и просто увеличивать память? В принципе, я так и собирался сделать, просто думал есть более лучшее решение. Но всё равно спасибо!

Да, так тоже можно. Но чтобы эта игра с памятью не сильно ударила по производительности, то советую сделать memory pool
romgermanДата: Пятница, 21 Августа 2015, 16:33 | Сообщение # 9
старожил
Сейчас нет на сайте
Посмотри здесь www.zlib.net/zlib_how.html
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг