Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Librerías De Descompresion

Iniciado por javiel, 19 de Enero de 2005, 01:47:39 PM

« anterior - próximo »

javiel

 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

uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

Astat

 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.

javiel

 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
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

Ithaqua

 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.
thaqua^Stravaganza
http://ithaqua.stravaganza.org

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
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

TheAzazel

 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

Zaelsius

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)

javiel

 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

uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

TheAzazel

 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

vicho

 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

ethernet

 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

javiel

 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
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

ALRAZ

 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"


vicho

 a mi tambien me daba esos errores, alfinal tuve que usar zlib solamente






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.