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.
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 -lt
lo que garantiza la respuesta correcta. pigz -l
hace lo que gzip -l
lo hace, lo que puede estar equivocado.
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