Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. [RESOLVIDO]Qt necessitas e LZMA
QtWS25 Last Chance

[RESOLVIDO]Qt necessitas e LZMA

Scheduled Pinned Locked Moved Portuguese
8 Posts 2 Posters 4.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    flaviomarcio
    wrote on last edited by
    #1

    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.

    Flavio Portela

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TioRoy
      wrote on last edited by
      #2

      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" :)

      1 Reply Last reply
      0
      • F Offline
        F Offline
        flaviomarcio
        wrote on last edited by
        #3

        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.exe[1]: 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.exe[1]: 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.exe[1]: *** [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'

        Flavio Portela

        1 Reply Last reply
        0
        • T Offline
          T Offline
          TioRoy
          wrote on last edited by
          #4

          Você adicionou os arquivos ao projeto?
          !http://s18.postimage.org/fiwkib7qx/Add_Exists_File.png!

          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).

          !http://s15.postimage.org/iw07rabx7/Projeto_Exemplo.png!

          1 Reply Last reply
          0
          • F Offline
            F Offline
            flaviomarcio
            wrote on last edited by
            #5

            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);

            Flavio Portela

            1 Reply Last reply
            0
            • T Offline
              T Offline
              TioRoy
              wrote on last edited by
              #6

              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.

              1 Reply Last reply
              0
              • F Offline
                F Offline
                flaviomarcio
                wrote on last edited by
                #7

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

                1-Mudei nome da "lzmautil.c" para "lzmautilteste.c"

                2-nele criei mais duas funções mais simples compress e decompress baseadas em "main2"

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

                char rs[800] = { 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 rs[800] = { 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;
                }

                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&#40;&#41;;
                

                }

                Valeu a ajuda obrigado

                Flavio Portela

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  TioRoy
                  wrote on last edited by
                  #8

                  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.

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved