Tamaño de archivo sin comprimir utilizando la función de acceso a archivos gzip de zlib

3 minutos de lectura

Usando la herramienta de línea de comandos de Linux gzip, puedo saber el tamaño sin comprimir de un archivo comprimido usando gzip -l.

No pude encontrar ninguna función como esa en la sección del manual de zlib “Funciones de acceso a archivos gzip”.

En este enlace, encontré una solución. http://www.abeel.be/content/determine-uncompressed-size-gzip-file eso implica leer los últimos 4 bytes del archivo, pero lo estoy evitando ahora porque prefiero usar las funciones de lib.

  • Nota: sé que hay preguntas similares, pero ninguna de ellas responde si en realidad hay una función zlib para eso.

    – André Puel

    9 de febrero de 2012 a las 10:28

Tamano de archivo sin comprimir utilizando la funcion de acceso
marca adler

No existe una forma confiable de obtener el tamaño sin comprimir de un archivo gzip sin descomprimir, o al menos decodificar todo. Hay tres razones.

Primero, la única información sobre la longitud sin comprimir son cuatro bytes al final del archivo gzip (almacenados en orden little-endian). Por necesidad, esa es la longitud módulo 232. Entonces, si la longitud sin comprimir es de 4 GB o más, no sabrá cuál es la longitud. Solo puede estar seguro de que la longitud sin comprimir es inferior a 4 GB si la longitud comprimida es inferior a algo así como 232 / 1032 + 18, o alrededor de 4 MB. (1032 es el factor de compresión máximo de deflación).

En segundo lugar, y esto es peor, un archivo gzip en realidad puede ser una concatenación de múltiples flujos gzip. Además de decodificar, no hay forma de encontrar dónde termina cada flujo de gzip para ver la longitud sin comprimir de cuatro bytes de esa pieza. (Lo que puede estar mal de todos modos debido a la primera razón).

En tercer lugar, los archivos gzip a veces tendrán basura después del final de la transmisión gzip (generalmente ceros). Entonces los últimos cuatro bytes no son la longitud.

Entonces gzip -l realmente no funciona de todos modos. Como resultado, no tiene sentido proporcionar esa función en zlib.

cerdoz tiene una opción para, de hecho, decodificar la entrada completa para obtener la longitud real sin comprimir: pigz -ltlo que garantiza la respuesta correcta. pigz -l hace lo que gzip -l lo hace, lo que puede estar equivocado.

  • ¿Sabes si bzip2 tiene las mismas limitaciones? Dado que estoy usando el tamaño total para medir el progreso de la descompresión, descomprimir primero no es una opción.

    – André Puel

    9 de febrero de 2012 a las 16:15

  • Simplemente puede usar el consumo de los datos comprimidos para su indicador de progreso, en lugar de la generación de datos sin comprimir. En primer orden, son proporcionales, por lo que vería la misma indicación de porcentaje.

    –Mark Adler

    9 de febrero de 2012 a las 16:59

  • ¿Qué quiere decir con “descomprimir, o al menos decodificar”? ¿Cuál es la diferencia entre “descomprimir” y “descifrar”?

    – todotucódigo

    27 de agosto de 2012 a las 22:53

  • Puede decodificar los códigos de Huffman y contar cuántos bytes se generarían, sin generarlos realmente. Eso sería más rápido que la descompresión completa, que genera los bytes descomprimidos.

    –Mark Adler

    28 de agosto de 2012 a las 1:44

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad