February 25, 2012

Flavio Portela Flavio Portela
Lab Rat
144 posts

[RESOLVIDO]Qt necessitas e LZMA

 

Olá.. gente estou tentando trabalhar com compressão no necessitas, no qtsdk para windows e linux é fácil, mas estou com problema para encontrar a mesma lib para o android. sei que devo compilar por exemplo a lib xz-embedded para “arm” pois para x86 e x64 ja existem em .dll e .so mas sinceramente não estou me saindo muito bem nem sei por onde começar, não sei como incluir os parâmetros para tentar compilar.

Bem, não precisa ser LZMA mas pelo menos uma compressão melhor que eu consegui colocar para funcionar que é a qCompress e qUncompress.

Obs:
Com qcompress tivess sucesso mas a compressão não é lá essas coisas, um arquivo de 2.5 MB foi para 800 KB mas preciso fazer com que ela chegue a 500KB ~ 600 KB que é justamente o que consigo gerando um arquivo .zip ou 7z.

 Signature 

Flavio Portela

7 replies

February 28, 2012

TioRoy TioRoy
Hobby Entomologist
246 posts

Flavio,

Dei uma olhada rápida no SDK do LZMA, e acho que é tranquilo incluir os fontes do SDK no seu projeto.

Fiz um teste rápido aqui, incluindo o diretório “C” que tem no pacote do SDK num projeto de teste e o QT compila tranquilo. O Necessitas deve compilar também de boa.
Com isso, você não faria uma chamada para um executável externo, mas sim, a funções dentro do seu programa.

No SDK tem um arquivo chamado “LzmaUtil.c”, que tem os exemplos de como usar a API. Me parece simples.

Para não misturar os seus fontes com os fontes do LZMA, descompacte o SDK em outro dir (por exemplo c:\Lib\LZMA). Clique em adicionar “arquivos existentes” ao projeto, e inclua todos os arquivos de “c:\lib\LZMA\C”. Depois abra seu arquivo .PRO e coloque:

INCLUDEPATH = c:/lib/lzma/C

(no meu teste coloquei um path relativo….)

Depois é só abrir o “LzmaUtil.c” e fazer uns “Ctrl+C Ctrl+V” :)

February 29, 2012

Flavio Portela Flavio Portela
Lab Rat
144 posts

Tentei fazer como você sugeriu,
1- Fiz o download de :
http://www.7-zip.org/sdk.html e entao http://downloads.sourceforge.net/sevenzip/lzma920.tar.bz2

2- descomprimir numa pasta apenas para coisa relacionadas com os projetos qt
3-criei um projeto vazio no qt.
4-inclui os o local INCLUDEPATH += D:/qt/lzma920/C
5-“LzmaUtil.c” e copie o conteúdo mas não dei certo então copie da linha 1 ate a linha 19, que achei um código pequeno e sem relação com o restante
e deu os seguintes erros

21:09:36: Running build steps for project untitled1…
21:09:36: Configuration unchanged, skipping qmake step.
21:09:36: Starting: “D:\qt\qtcreator-2.4.0\mingw\bin\mingw32-make.exe”
D:/qt/qtcreator-2.4.0/mingw/bin/mingw32-make.exe -f Makefile.Debug
mingw32-make.exe1: Entering directory `D:/qt/projects/untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug’
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I”..\..\4.7.4w32\include\QtCore” -I”..\..\4.7.4w32\include\QtGui” -I”..\..\4.7.4w32\include” -I”..\..\lzma920\C” -I”..\..\4.7.4w32\include\ActiveQt” -I“debug” -I”.” -I”..\untitled1” -I”.” -I”..\..\4.7.4w32\mkspecs\win32-g++” -o debug\mainwindow.o ..\untitled1\mainwindow.cpp
..\untitled1\mainwindow.cpp:24: warning: ‘g_Alloc’ defined but not used
g++ -mthreads -Wl,-subsystem,windows -o debug\untitled1.exe debug/main.o debug/mainwindow.o debug/moc_mainwindow.o -L“d:\qt\4.7.4w32\lib” -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4
mingw32-make.exe1: Leaving directory `D:/qt/projects/untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug’
debug/mainwindow.o: In function `SzAlloc’:
D:\qt\projects\untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug/../untitled1/mainwindow.cpp:22: undefined reference to `MyAlloc’
debug/mainwindow.o: In function `SzFree’:
D:\qt\projects\untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug/../untitled1/mainwindow.cpp:23: undefined reference to `MyFree’
collect2: ld returned 1 exit status
mingw32-make.exe1: *** [debug\untitled1.exe] Error 1
mingw32-make.exe: *** [debug] Error 2
21:09:38: The process “D:\qt\qtcreator-2.4.0\mingw\bin\mingw32-make.exe” exited with code 2.
Error while building project untitled1 (target: Desktop)
When executing build step ‘Make’

 Signature 

Flavio Portela

February 29, 2012

TioRoy TioRoy
Hobby Entomologist
246 posts

Você adicionou os arquivos ao projeto?

Está dando erro, pois justamente não está achando os símbolos necessários (no caso a função MyAlloc – que está definida em Alloc.h e implementada em Alloc.c).

March 1, 2012

Flavio Portela Flavio Portela
Lab Rat
144 posts

Fiz aqui e funcionou mesmo apenas o INCLUDEPATH não resolveria, foi mal to migrando do delphi para C++ e estou tendo uma certa dificuldade principalmente em botar para funcionar bibliotecas como essa da lzma. Mas notei que essa lzmaUtil apenas comprime um buffer. é claro tentei fazer utilizar 7z.h e novamente depois de algumas horas me senti perdido de novo porque não consegui fazer funcionar e documentação infelizmente não achei nada que me ajudasse. Você por um acaso não passou por um exemplo mais simplificado com o lzmasdk em algum lugar não né?

exemplo tipo:

bool compress(qstring filesouce, qstring filedestin);
bool decompress(qstring filesouce, qstring filedestin);

 Signature 

Flavio Portela

March 2, 2012

TioRoy TioRoy
Hobby Entomologist
246 posts

Eu realmente não fiz um estudo do LZMA. Apenas uma olhada rápida. Mas dê uma olhada no método main2, que ele faz exatamente o que você quer: compactar um arquivo.

March 7, 2012

Flavio Portela Flavio Portela
Lab Rat
144 posts

bem, utilizando o “main2” como orientação deu certo sim, precisou apenas dos seguintes passos:

  1. 1-Mudei nome da “lzmautil.c” para “lzmautilteste.c”
  2. 2-nele criei mais duas funções mais simples compress e decompress baseadas em “main2”

int compress(char *inFileName,char *outFileName)
{

char rs800 = { 0 }; CFileSeqInStream inStream; CFileOutStream outStream; int res; FileSeqInStream_CreateVTable(&inStream); File_Construct(&inStream.file); FileOutStream_CreateVTable(&outStream); File_Construct(&outStream.file); { size_t t4 = sizeof(UInt32); size_t t8 = sizeof(UInt64); if (t4 != 4 || t8 != 8) return PrintError(rs, “Incorrect UInt32 or UInt64”); } if (InFile_Open(&inStream.file, inFileName) != 0) return PrintError(rs, “Can not open input file”); if (OutFile_Open(&outStream.file, outFileName ) != 0) return PrintError(rs, “Can not open output file”); UInt64 fileSize; File_GetLength(&inStream.file, &fileSize); res = Encode(&outStream.s, &inStream.s, fileSize, rs); File_Close(&outStream.file); File_Close(&inStream.file); if (res != SZ_OK) { if (res SZ_ERROR_MEM) return PrintError(rs, kCantAllocateMessage); else if (res SZ_ERROR_DATA) return PrintError(rs, kDataErrorMessage); else if (res SZ_ERROR_WRITE) return PrintError(rs, kCantWriteMessage); else if (res SZ_ERROR_READ) return PrintError(rs, kCantReadMessage); return PrintErrorNumber(rs, res); } return 0; }

int Decompress(char *inFileName,char *outFileName)
{ char rs800 = { 0 }; CFileSeqInStream inStream; CFileOutStream outStream; int res; //Bool useOutFile = False;

FileSeqInStream_CreateVTable(&inStream); File_Construct(&inStream.file); FileOutStream_CreateVTable(&outStream); File_Construct(&outStream.file); size_t t4 = sizeof(UInt32); size_t t8 = sizeof(UInt64); if (t4 != 4 || t8 != 8) return PrintError(rs, “Incorrect UInt32 or UInt64”); if (InFile_Open(&inStream.file, inFileName) != 0) return PrintError(rs, “Can not open input file”); if (OutFile_Open(&outStream.file, outFileName) != 0) return PrintError(rs, “Can not open output file”); res = Decode(&outStream.s, &inStream.s); File_Close(&outStream.file); File_Close(&inStream.file); if (res != SZ_OK) { if (res SZ_ERROR_MEM) return PrintError(rs, kCantAllocateMessage); else if (res SZ_ERROR_DATA) return PrintError(rs, kDataErrorMessage); else if (res SZ_ERROR_WRITE) return PrintError(rs, kCantWriteMessage); else if (res SZ_ERROR_READ) return PrintError(rs, kCantReadMessage); return PrintErrorNumber(rs, res); } return 0; }
  1. 3-coloquei o include do novo arquivo no projeto, ai foi fácil apenas chamei a função e pronto, não gerar um 7z com cabeçalho e tudo mais, mas gera uma compressão boa e pode ainda extraído pelo proprio 7zip

#include <QtGui/QApplication>
#include “mainwindow.h”

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include “lzma920/C/Util/Lzma/LzmaUtiltest.c”

int main(int argc, char *argv[])
{ QApplication a(argc, argv); //MainWindow w; //w.show();

char *inFileName=“c:/dbforcacad001.db”; char *outFileName=“c:/dbforcacad001.lzma”; compress(inFileName,outFileName); inFileName=outFileName; outFileName=“c:/dbforcacad001.lzma.db”; Decompress(inFileName,outFileName); //return a.exec(); }

Valeu a ajuda obrigado

 Signature 

Flavio Portela

March 12, 2012

TioRoy TioRoy
Hobby Entomologist
246 posts

Flavio,

De nada. Estamos aqui para isso mesmo!

Seguindo a boa prática do fórum, acho que você poderia editar o título do do post para [SOLVED] ([RESOLVIDO] talvez?) para facilitar a leitura de quem procura algo no fórum.

 
  ‹‹ Plugin para o Qt Designer e Cmake      Trabalhando com múltiplos forms ››

You must log in to post a reply. Not a member yet? Register here!