Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: javiel en 19 de Enero de 2005, 01:47:39 PM

Título: Librerías De Descompresion
Publicado por: javiel en 19 de Enero de 2005, 01:47:39 PM
 Hola a todos:

Necesito unas librerías de descompresión (de zip por ejemplo) pero que funcionen en linux y windows. Creo que de las mas conocidas es:

http://www.gzip.org/zlib/

He estado mirando pero no me entero muy bien como funciona. ¿sabéis de algún ejemplo sencillo de utilizar para comprimir y descomprimir en c++?

A lo mejor hay otra libreria mas sencilla

Gracias y un saludo

Título: Librerías De Descompresion
Publicado por: Astat en 19 de Enero de 2005, 02:13:42 PM
 Te pasteo algo de mi codigo porsi te sirve:

bool cEvilExport::AddBuffer(void *buffer, unsigned size, const char *fileName, zipFile zFile)
{
 if (buffer == NULL || !size)
   return Error("(!) '%s' sin datos, ignorandolo", fileName);

 if (zFile)
 {
   int err;
   zip_fileinfo zi;

   zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
   zi.dosDate = 0;
   zi.internal_fa = 0;
   zi.external_fa = 0;
   filetime((char*)fileName, &zi.tmz_date, &zi.dosDate);

   if (m_nOptionEncrypt && !m_strPassword.empty())
   {
     uLong crc = crc32(crc32(0L, Z_NULL, 0), (const Bytef *)buffer, size);
     err = zipOpenNewFileInZip3(zFile, fileName, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, m_strPassword.c_str(), crc);
   }
   else
     err = zipOpenNewFileInZip(zFile, fileName, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION);

   if (err == ZIP_OK)
   {
     err = zipWriteInFileInZip(zFile, buffer, size);
     if (err < 0)
       return Error("(!) Error al escribir \"%s\", ignorandolo", fileName);
   }
   else
     return Error("(!) Error al insertar \"%s\", ignorandolo", fileName);

   zipCloseFileInZip(zFile);
 }
 else
 {
    ...
 }

 return true;
}


eso seria para comprimir, para descomprimir:

iFile *cFileSystemWIN32::Open(const std::string &strFileName, const std::string &strOptions)
{
 assert(!strFileName.empty());
 //char tempPathID[MAX_PATH];
 //ParsePathID(pFileName, pathID, tempPathID);

 int hFile;
 cFileWIN32 *newFile;

 if ((hFile = _open(strFileName.c_str(), _O_BINARY | _O_RDONLY)) != -1)
 {
    ...
 }
 else    // Buscamos en los comprimidos
 {
   unzFile zipFile;

   for (std::map<std::string, std::set<std::string> >::const_iterator it = m_mapFiles.begin(); it != m_mapFiles.end(); ++it)
   {
     if (it->second.find(strFileName) == it->second.end())
       continue;

     if ((zipFile = unzOpen(it->first.c_str())) != NULL)
     {
       if (unzLocateFile(zipFile, strFileName.c_str(), 0) == UNZ_OK)
       {
         unz_file_info fileInfo;

         unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0);

         if (fileInfo.uncompressed_size == 0)
           TRACE(LVL_ERROR, "[iFileSystem] '%s' in '%s' is empty", strFileName.c_str(), it->first.c_str());

         if (unzOpenCurrentFile(zipFile) == UNZ_OK)
         {
           int nError;
           newFile = new cFileWIN32(fileInfo.uncompressed_size);

           nError = unzReadCurrentFile(zipFile, newFile->m_pMemory, fileInfo.uncompressed_size);
           if (nError < 0)
             TRACE(LVL_ERROR, "[iFileSystem] Uncompress error at '%s' in '%s' (%d)", strFileName.c_str(), it->first.c_str(), nError);

           unzCloseCurrentFile(zipFile);
           unzClose(zipFile);

           return newFile;
         }
         else
           TRACE(LVL_ERROR, "[iFileSystem] cant open '%s' in '%s'", strFileName.c_str(), it->first.c_str());
       }
     }
     else
       TRACE(LVL_ERROR, "[iFileSystem] '%s' in '%s' corrupt", strFileName.c_str(), it->first.c_str());
   }

 }

 TRACE(LVL_WARNING, "[iFileSystem] '%s' not found", strFileName.c_str());

 return NULL;
}


Hechale un ojo tambien a http://www.7-zip.org/ que es, creo, mejor que la zlib.
Título: Librerías De Descompresion
Publicado por: javiel en 19 de Enero de 2005, 05:46:20 PM
 Te agradezco que me pases el código pero la verdad no entiendo como lo haces. Supongo que lo estas haciendo con "zlib" ¿no?. Voy a mirarme el manual de zlib bien antes de seguir con tu código a ver si eso me saca de dudas.

¿hay algún tuto es español para usar zlib en c++?

gracias
Título: Librerías De Descompresion
Publicado por: Ithaqua en 19 de Enero de 2005, 06:22:48 PM
 http://www.unrarlib.org

La mejor librería de descompresión que conozco, tanto por el formato como por la facilidad de uso.
zlib está bien, la uso igualmente, pero requiere que te hagas con una pequeña capa por encima de alto nivel para poder manejar los ficheros.
Título: Librerías De Descompresion
Publicado por: javiel en 23 de Enero de 2005, 02:26:06 PM
 Nadie tiene o sabe de algún código que lea un archivo ZIP con Zlib??

Os lo agradecería mucho pq no consigo que me funcione y no lo entiendo bien

He visto las librerías RAR y la verdad que son la caña de sencillas. La cuestión es que me gustaría que fuesen las Zlib ya que quiero compilar el juego que estoy haciendo también en la GP32 y se que las Zlib funcionan bien ahí.

Muchas gracias por todo
Título: Librerías De Descompresion
Publicado por: TheAzazel en 23 de Enero de 2005, 03:00:43 PM
 Javiel, si no tienes la necesidad de que lean .zip... existen otras librerias que son bastante sencillas y orientadas a las descompresion en tiempo real (no llegan a comprimir tanto como zlib pero si quieres maxima compresion tienes que usar las bzip2).
Bueno, q me voy por las ramas, a lo que iba, prueba las UCL  que las encontraras aqui:

http://www.oberhumer.com/opensource/ucl/

son portables, sencillas de usar, comprimen a gran velocidad y son rapidisimas descomprimiendo. Para comprimir, con 1 funcion lo haras y para descomprimir igual... mas faciles imposibles  :P . Si tienes algun problema utilizandolas o lo que sea, dime algo vale?
un saludo
Título: Librerías De Descompresion
Publicado por: Zaelsius en 23 de Enero de 2005, 03:37:28 PM
Cita de: "javiel"Nadie tiene o sabe de algún código que lea un archivo ZIP con Zlib??

Os lo agradecería mucho pq no consigo que me funcione y no lo entiendo bien

He visto las librerías RAR y la verdad que son la caña de sencillas. La cuestión es que me gustaría que fuesen las Zlib ya que quiero compilar el juego que estoy haciendo también en la GP32 y se que las Zlib funcionan bien ahí.

Muchas gracias por todo
Creo que hay un error de concepto..

La libreria ZLib en sí misma, sólo provee de mecanismos para comprimir/descomprimir datos. No tiene nada que ver con el formato de fichero utilizado para distribuir los datos*

Por ejemplo, los formatos .Zip o .Gzip usan el algoritmo de compresión implementado en ZLib. Yo en su día me hice un formato de fichero propio, pero comprimía usando ZLib.

Tu necesitas una libreria que maneje ficheros .Zip. Lo más normal es que esté basada en ZLib.

* Nota: ZLib sí incluye varias funciones de nivel superior para tratar ficheros comprimidos, pero en formato .gzip(en Linux es cómodo manejarlos, pero en Windows tienes q rebuscar alguna GUI)
Título: Librerías De Descompresion
Publicado por: javiel en 23 de Enero de 2005, 04:43:26 PM
 Gracias me va quedando mas claro.

Veo que la que dice TheAzazel está bastante bien. La he instalado y funciona perfecto. Lo que no encuentro es nada de documentacion en la página de como utilizarla. He visto los dos ejemplos que vienen, pero me entero de poco la verdad. Dices que simplemente con 1 funcion puedo comprimir y descomprimir ¿tienes algun codigo que haga eso?

Me gustaría implementar un código que con esa librería sacara un archivo concreto de un archivo comprimido en ZIP. Por ejemplo, tengo 1 archivo zip llamado "archivos.zip" y dentro un montón de imágenes. Lo que necesito es una funcion que le pase el archivo zip y el nombre de una de las imagenes de dentro y me las saque

Graicas por todo y por la explicación de ZaelSiuS

Título: Librerías De Descompresion
Publicado por: TheAzazel en 23 de Enero de 2005, 05:04:51 PM
 Uhm....
si quieres abrir un .zip para descomprimir un fichero... UCL no te servira ya que no es el mismo formato de compresion...
si quieres hacer eso, tienes q hacer caso de lo que te han dicho los demas.... en concreto zaelsius.... y utilizar zlib para acceder al .zip, un saludo
Título: Librerías De Descompresion
Publicado por: vicho en 23 de Enero de 2005, 05:26:46 PM
 la zziplib maneja de forma mas extendida los ficheros zip

una cosa, zlib maneja ficheros zip tmb es un poco oscuro enrrealidad, pero funciona bastante bien, recuerdo haber visto en la documentacion esas cosas y en los ejemplos

suerte
Título: Librerías De Descompresion
Publicado por: ethernet en 23 de Enero de 2005, 06:13:40 PM
 Hace un tiempo javier Arevalo publicó en el COTD de flipcode.com (.com!) un código para hacer exactamente lo que tú quieres. Supongo que estará tb en su página personal.

También me suena que la gente usaba el cargador de zip's de un emulador conocido, no sé cual .. :)

saludos
Título: Librerías De Descompresion
Publicado por: javiel en 23 de Enero de 2005, 06:56:30 PM
 Las librerías ZZIP son exactamente lo que estaba buscando. Además y por casualidad he encotrado esta web:

http://www.kekkai.org/roger/sdl/rwops/rwops.html

que explica exactamente lo que yo quiero hacer en SDL.

Gracias a todos por vuestra ayuda
Título: Librerías De Descompresion
Publicado por: ALRAZ en 24 de Enero de 2005, 02:48:07 AM
 Ya que estamos en el tema...

alguien em puede explicar por qué el visual studio me marca error de sintaxys al intentar compilar las zziplib ?
es la versión 0.13.38 y por más que le he buscado, no sale de donde mismo.

me marca 6 errores de sintaxys en 2 líneas (3 en cada linea) en el archivo fetch.h:


/* get 16/32 bits from little-endian zip-file to host byteorder */
extern uint32_t __zzip_get32(unsigned char * s) __attribute__((const));
extern uint16_t __zzip_get16(unsigned char * s) __attribute__((const));


estoy usando el proyecto de vc7 que viene junto con los fuentes y tratando de compilar la configuración "release".
Los errores me los marca en el __attribute, en el ; y otro dice algo de "tipo"

Título: Librerías De Descompresion
Publicado por: vicho en 24 de Enero de 2005, 08:29:49 AM
 a mi tambien me daba esos errores, alfinal tuve que usar zlib solamente