ZLib Descompresión en C++

Estoy tratando de obtener una función que va a descomprimir un archivo de texto comprimido con .gz. Es necesario descomprimir el .gz archivo dado su camino y escribir sin comprimir archivo de texto dada su destino. Estoy usando C++ y lo que he visto es que ZLIB hace exactamente lo que necesito, excepto que no puedo encontrar 1 solo ejemplo en cualquier lugar en la red que se muestra haciendo esto. ¿Alguien puede mostrarme un ejemplo o al menos que me guíe en la dirección correcta?

InformationsquelleAutor RobNHood | 2013-06-12

4 Kommentare

  1. 3

    Si sólo quieres inflar un archivo con el formato raw, desinflado de datos (es decir, no hay ningún archivo) se puede usar algo como esto:

    gzFile inFileZ = gzopen(fileName, "rb");
    if (inFileZ == NULL) {
        printf("Error: Failed to gzopen %s\n", filename);
        exit(0);
    }
    unsigned char unzipBuffer[8192];
    unsigned int unzippedBytes;
    std::vector<unsigned char> unzippedData;
    while (true) {
        unzippedBytes = gzread(inFileZ, unzipBuffer, 8192);
        if (unzippedBytes > 0) {
            unzippedData.insert(unzippedData.end(), unzipBuffer, unzipBuffer + unzippedBytes);
        } else {
            break;
        }
    }
    gzclose(inFileZ);

    La unzippedData vector que ahora ostenta su inflado de datos. Probablemente hay maneras más eficientes de almacenar el inflado de los datos, especialmente si usted sabe el tamaño sin comprimir de anticipación, pero este enfoque funciona para mí.

    Si sólo desea guardar el inflado de datos a un archivo sin ningún procesamiento podría omitir el vector y solo escribe la unzipBuffer contenido a otro archivo.

    • He encontrado que se puede necesitar llamar gzbuffer después de gzopen para evitar un Z_BUF_ERROR por ejemplo, gzbuffer(inFileZ, 32768); También, asegúrese de que usted undefine NO_GZIP para garantizar la GZIP encabezado de verificación no es IFDEFed en inflar.c
  2. 1

    Puede utilizar el gzopen(), gzread() y gzclose() funciones de zlib, como las correspondientes funciones de stdio fopen(), etc. Que va a leer el gzip archivo y descomprimirlo. Usted puede utilizar fopen(), fwrite(), etc. para escribir los datos sin comprimir de nuevo.

    • Gracias por que. Yo creo que el problema que se planteaba era que yo estaba usando zlib externamente mediante la zdll1 y la vinculación con zdll.lib aunque zlib la documentación dice que funciona bien con ambos de 32 y 64 bits, las aplicaciones de Mi aplicación se compila con x64 que incluso aunque no se especifica el archivo dll podría haber sido compilado con x86 y sólo el 1 dll. Puedo obtener sin resolver errores del vinculador para inflar. Voy a intentar incluyendo zlib dentro de mi proyecto en lugar de vincular a la dll y ver si eso soluciona el problema.
    • No todavía sin resolver errores de símbolos para inflateInit e inflar incluso cuando se incluye zlib internamente.
    • Usted necesitará post una pregunta diferente para ayudar con algo tan básico como compilar y vincular código.
    • zlib sólo tiene 1 biblioteca. Sé cómo vincular a las bibliotecas y directorios. Obviamente zlib es basura, así que voy a estar mirando a otra parte de otra solución.
    • Adler: Obviamente, él no darse cuenta de que estaba hablando con el proyecto del mantenedor.
  3. 0

    Ah, voy a asumir http://zlib.net/zlib_how.html hace lo que quiere?

    • para ser honesto con usted, yo leí eso y se alejó aún más confundido. Sobre todo en cuanto a lo que las diferencias fueron entre inf y descomprimir, y respecto a la asignación de búfer.
    • Bueno, no es un simple archivo de código fuente en zlib.net/zpipe.c (enlace de la página) y es 206 líneas de código, incluyendo los comentarios. No estoy seguro de que usted puede conseguir mucho más simple que eso, realmente.
    • Sobre todo lo que me vi en zpipe.c fue descomprimir búfer asignado en memoria, no a partir de un archivo de código fuente de archivo de destino. La lectura que he hecho de los puntos de mí a pensar que la mejor manera de implementar esto en C++ es utilizar uno de los muchos ZLIB contenedores que están flotando. Si ZLIB es tan recto hacia adelante, no veo la razón para toda la ZLIB invoca contenedores.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...