Поиск:

Ответ в темуСоздание новой темы Создание опроса
> qCompress как распаковать? 
V
    Опции темы
Mr_Devil
  Дата 18.3.2012, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Есть приложение, которое экспортирует свои данные в XML-файл, но предварительно сжимает его:
Код

QByteArray compressedArray=qCompress(byteArray,9);
exportFile.write(compressedArray);
exportFile.close();

Распаковывает она все это дело обратно таким образом:
Код

QByteArray byteArray=qUncompress(fileImport.readAll());

Каким образом можно самостоятельно распаковать файл не имея фреймворка Qt?
Архиваторы его не распознают, видимо, не хватает заголовков. В папке с программой есть библиотека QtCore4.dll v4.7, в ней есть функции compress и uncompress. Попытки воспользоваться этими функциями на Delphi пока ни к чему не привели, т.к. реализации класса QByteArray в Delphi нет.

Подскажите, пожалуйста, как можно решить проблему? Может есть другие библиотеки с заголовками для Delphi, которые можно использовать?

З.Ы.: C++ не владею, фреймворка нет.



PM MAIL ICQ   Вверх
borisbn
Дата 18.3.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Делаешь dll-ку на Си++, использующую Qt и экспортирующую 2 функции
Код
char* uncompress_wrap( const char * data, unsigned int dataSize, unsigned int * uncompressedSize );
void clean_after_uncompress( char*);

Первая будет делать следующее
Код

char* uncompress_wrap( const char * data, unsigned int dataSize, unsigned int * uncompressedSize ) {
    QByteArray ba = qUncompress( QByteArray( data, dataSize ) );
    *uncompressedSize = ba.size();
    char * p = new char[ *uncompressedSize ];
    memcpy( p, ba.constData(), *uncompressedSize );
    return p;
}

Вторая:
Код

void clean_after_uncompress( char * p ) {
    delete []p;
}

Как в дельфи подключить обычную dll-ку и импортировать оттуда функции не знаю, но, думаю, это - несложно

Это сообщение отредактировал(а) borisbn - 18.3.2012, 10:06


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 18.3.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(Mr_Devil @  18.3.2012,  03:41 Найти цитируемый пост)
Каким образом можно самостоятельно распаковать файл не имея фреймворка Qt?

таким.

Цитата(Mr_Devil @  18.3.2012,  03:41 Найти цитируемый пост)
есть функции compress и uncompress

по всей видимости, это экспорт функций zlib.

PM WWW   Вверх
borisbn
Дата 18.3.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(boostcoder @  18.3.2012,  10:10 Найти цитируемый пост)
по всей видимости, это экспорт функций zlib

ага. единственно что - они добавляют к данным 4 байта - размер распакованных данных. если их отрезать, то можно пользоваться zlib-ом. я уже так делал. работатет


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Sahab
Дата 18.3.2012, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: 2
Всего: 3



Цитата(borisbn @  18.3.2012,  10:21 Найти цитируемый пост)
они добавляют к данным 4 байта

зочем?
PM MAIL   Вверх
borisbn
Дата 18.3.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Sahab @  18.3.2012,  12:25 Найти цитируемый пост)
зочем? 

наверное, чтобы при распаковке заранее знать размер данных


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Mr_Devil
Дата 18.3.2012, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Цитата(borisbn @ 18.3.2012,  10:06)
Делаешь dll-ку на Си++, использующую Qt и экспортирующую 2 функции

Идея хорошая, но даже если я найду компилятор, у меня нет самого фреймворка, где объявлены все эти классы и функции (QByteArray, qUncompress). К тому же в C++ я, можно сказать, мало что понимаю smile

Цитата(borisbn @ 18.3.2012,  10:06)
Как в дельфи подключить обычную dll-ку и импортировать оттуда функции не знаю, но, думаю, это - несложно

Не сложно, я хотел использовать напрямую библиотеку QtCore4.dll, но не знаю какие параметры передавать, в каком порядке и каких типов.

Может быть можно что-то к этому архиву дописать, чтобы можно было открыть каким-нибудь архиватором?

Цитата(boostcoder @ 18.3.2012,  10:10)
Цитата(Mr_Devil @  18.3.2012,  03:41 Найти цитируемый пост)
Каким образом можно самостоятельно распаковать файл не имея фреймворка Qt?

таким.

Не совсем понял что там написано. Это реализация qUncompress? В исходном тексте (в моем первом сообщении) передается только 1 параметр. Почему там 2 параметра и чем это может помочь? Предлагаете самостоятельно сделать реализацию всех используемых классов на Делфи?

Цитата(boostcoder @ 18.3.2012,  10:10)
Цитата(Mr_Devil @  18.3.2012,  03:41 Найти цитируемый пост)
есть функции compress и uncompress

по всей видимости, это экспорт функций zlib.

Есть где почитать, что им можно передавать и как забирать?

Цитата(borisbn @ 18.3.2012,  10:21)
Цитата(boostcoder @  18.3.2012,  10:10 Найти цитируемый пост)
по всей видимости, это экспорт функций zlib

ага. единственно что - они добавляют к данным 4 байта - размер распакованных данных. если их отрезать, то можно пользоваться zlib-ом. я уже так делал. работатет

Если воспользоваться zlib'ом, можно будет извлечь данные, не зная исходного размера?

Это сообщение отредактировал(а) Mr_Devil - 19.3.2012, 00:53
PM MAIL ICQ   Вверх
borisbn
Дата 19.3.2012, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Mr_Devil @  18.3.2012,  23:47 Найти цитируемый пост)
Есть где почитать, что им можно передавать и как забирать?

http://zlib.net/manual.html

Цитата(Mr_Devil @  18.3.2012,  23:47 Найти цитируемый пост)
Если воспользоваться zlib'ом, можно будет извлечь данные, не зная исходного размера?

можно. отрезаешь первые 4 байта и отдаёшь остаток в ф-цию распаковки zlib'а. единственное что - при смене библиотеки Qt они могут сменить формат и такой рукоблудный qUncompress работать не будет. так что лучше воспользуйся способом из моего первого сообщения


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Mr_Devil
Дата 19.3.2012, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Цитата(borisbn @ 19.3.2012,  08:47)
Цитата(Mr_Devil @  18.3.2012,  23:47 Найти цитируемый пост)
Если воспользоваться zlib'ом, можно будет извлечь данные, не зная исходного размера?

можно. отрезаешь первые 4 байта и отдаёшь остаток в ф-цию распаковки zlib'а. единственное что - при смене библиотеки Qt они могут сменить формат и такой рукоблудный qUncompress работать не будет. так что лучше воспользуйся способом из моего первого сообщения

Спасибо за помощь, все получилось. Отрезал 4 байта и распаковал ZLib'ом. Библиотека Qt не поменяется, т.к. приложение я обновлять не собираюсь, мне нужно было только разобрать его формат экспорта, чтобы слепить для него файл импорта со своими данными. Теперь с библиотекой ZLib автоматически решился второй вопрос "Чем запаковать обратно?" smile

Скомпилированную библитеку ZLib взял здесь. Это ссылка с сайта ZLib.
Обертку библиотеки для Delphi взял тут. Эту ссылку я тоже нашел на сайте ZLib.

получился такой вот код:
Код

...
uses ZLibEx, ZLibExApi
...
procedure TForm1.FormCreate(Sender: TObject);
var
  FileIn,FileOut: THandle;
  PArrIn, PArrOut: Pointer;
  i: Cardinal;
begin
  FileIn:=CreateFile('123.rcp',GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
  i:=GetFileSize(FileIn,nil)-4;
  PArrIn:=AllocMem(i);
  FileSeek(FileIn,4,0);
  ReadFile(FileIn,PArrIn^,i,i,nil);
  CloseHandle(FileIn);
  ZDecompress(PArrIn,i,PArrOut,Integer(i));
  FreeMem(PArrIn);
  FileOut:=CreateFile('123.rcp.xml',GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
  WriteFile(FileOut,PArrOut^,i,i,nil);
  FreeMem(PArrOut);
  CloseHandle(FileOut);
end;


З.Ы.: Есть такая утилита WinHEX, там в меню Edit -> Convert есть вариант конвертации "zlib inflate". Отрезаем у файла первые 4 байта, потом делаем конвертацию и получаем такой же результат как и у ZLib'а smile Это первое из того что мне было нужно - убедиться что там всетаки XML.

З.З.Ы.: К сожалению, у меня не хватает постов для плюсования тех, кто помогал  smile 

Это сообщение отредактировал(а) Mr_Devil - 19.3.2012, 16:39
PM MAIL ICQ   Вверх
boostcoder
Дата 19.3.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



маладца что решение выложил!

Цитата(Mr_Devil @  19.3.2012,  16:31 Найти цитируемый пост)
К сожалению, у меня не хватает постов для плюсования тех, кто помогал

успеешь)
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.