2011-05-19 1107 views
21

Tengo un programa en C/C++ que necesita para leer en un archivo que puede o no puede ser comprimido gzip. Sé que podemos utilizar gzread() de zlib para leer en ambos archivos comprimidos y sin comprimir - sin embargo, quiero usar las funciones de zlib sólo si el archivo está comprimido con gzip (por razones de rendimiento).¿Cómo comprobar si un archivo está comprimido gzip?

Entonces, ¿hay alguna forma de detectar mediante programación o verificar si un determinado archivo tiene gzip de C/C++?

+1

@Rob Kennedy: Hay una gran diferencia: 1min (fread) vs 20mins (gzread) para archivos sin comprimir. Puede que tenga que ver con nosotros usando una versión anterior de zlib, pero en este momento no estoy en condiciones de usar la última versión, por lo que debo hacer la lectura condicional. –

Respuesta

42

Hay un número mágico en el principio del archivo. Simplemente lea los primeros dos bytes y verifique si son iguales a 0x1f8b.

+28

Tenga cuidado con el ancho del extremo y el byte. Compara los valores individuales en lugar de un compuesto: '(byte1 == 0x1f) && (byte2 == 0x8b)' contra 'first2bytes == 0x1f8b'. – pmg

+0

@pmg: Gracias por el aviso. :) –

1

Puede probar las firmas descritas en los RFC 1951 y 1952 para tener una idea. Para los archivos GZIP, el segundo es relevante y es definitivo. Hay algunos falsos positivos en otros formatos, por lo que debe verificar la mayor cantidad de encabezado para obtener valores plausibles.

Para las transmisiones zlib es algo más difícil, porque son aún más propensas a los falsos positivos. Pero rara vez te encontrarás con los que están en la naturaleza por sí solos.

3

¿Cuál es la diferencia de rendimiento entre leer archivos comprimidos y descomprimidos usando gzread()?

De todos modos, para detectar si un archivo tiene gzip, puede leer el magic number al comienzo del archivo, que es 1f 8b de acuerdo con el enlace.

+0

En cuanto al rendimiento: hay una gran diferencia: 1 minuto (fread) vs 20 minutos (gzread) para archivos sin comprimir. Puede que tenga que ver con nosotros usando una versión anterior de zlib, pero en este momento no estoy en condiciones de usar la última versión, por lo que tengo que hacer la lectura condicional para evitar esto. –

8

¿Prefiere los falsos positivos, los falsos negativos o los resultados falsos en absoluto (no funciona el rendimiento por el desagüe ...)?

Los RFC 1952: GZIP file format specification version 4.3 estados de los primeros 2 bytes (de cada miembro y por lo tanto) del archivo son '\x1F' y '\x8B'. Úselo para un primer control que puede dar como resultado falsos positivos.

Cuestiones relacionadas