2012-01-29 21 views
41

En mi proyecto, necesito saber cómo es un encabezado zlib. He oído que es bastante simple, pero no puedo encontrar ninguna descripción del encabezado zlib.¿Cómo se ve un encabezado zlib?

Por ejemplo, ¿contiene un número mágico?

Respuesta

52

Link to RFC

0 1 
+---+---+ 
|CMF|FLG| 
+---+---+ 

CMF (Método de compresión y banderas) Este byte se divide en un método de compresión de 4 bits y un campo de bits de información 4- dependiendo del método de compresión.

bits 0 to 3 CM  Compression method 
bits 4 to 7 CINFO Compression info 

CM (Método de compresión) Esto identifica el método de compresión utilizado en el archivo. CM = 8 denota el método de compresión "desinflar" con un tamaño de ventana de hasta a 32K. Este es el método utilizado por gzip y PNG y casi todo lo demás. CM = 15 está reservado.

CINFO (info Compression) Para CM = 8, CINFO es el logaritmo en base 2 de la tamaño LZ77 ventana , menos ocho (CINFO = 7 indica un tamaño de ventana de 32 K). Los valores de CINFO arriba de 7 no están permitidos en esta versión de la especificación . CINFO no se define en esta especificación para CM no es igual a 8.

En la práctica, esto significa que el primer byte es casi siempre 78 (hex)

FLG (banderas) Este byte indicador se divide como sigue:

bits 0 to 4 FCHECK (check bits for CMF and FLG) 
bit 5  FDICT (preset dictionary) 
bits 6 to 7 FLEVEL (compression level) 

El valor fcheck debe ser tal que CMF y FLG, cuando se ve como un entero sin signo de 16 bits almacenado en orden MSB (CMF * 256 + FLG), es un múltiplo de 31.

FLEVEL (nivel de compresión) Estos indicadores están disponibles para su uso mediante métodos específicos de compresión . El método de "desinflar" (CM = 8) establece estas banderas como sigue:

 0 - compressor used fastest algorithm 
     1 - compressor used fast algorithm 
     2 - compressor used default algorithm 
     3 - compressor used maximum compression, slowest algorithm 
+0

Esta es una gran respuesta :), me ayudó a salir de muchas maneras ... Hey! buen avatar – Ryan

74

zlib cabeceras mágicas

78 01 - No Compression/low 
78 9C - Default Compression 
78 DA - Best Compression 
+0

Esto me ayudó a averiguar qué tipo de compresión estaba tratando. Sabía que el archivo estaba comprimido, pero estaba haciendo búsquedas de algunos bytes de encabezado y esto surgió. ¡Gracias! – ProVega

+4

Cuando uso el Inflador de Java (usa ZLIB) estoy viendo valores de encabezado de 120, -100. Esto equivale a 78 9C. Realiza una copia de seguridad de lo que dijiste anteriormente. – Dan

10

A continuación se presenta el formato de datos Zlib comprimido.

+---+---+ 
|CMF|FLG| (2 bytes - Defines the compression mode - More details below) 
+---+---+ 
+---+---+---+---+ 
|  DICTID | (4 bytes. Present only when FLG.FDICT is set.) - Mostly not set 
+---+---+---+---+ 
+=====================+ 
|...compressed data...| (variable size of data) 
+=====================+ 
+---+---+---+---+ 
|  ADLER32 | (4 bytes of checksum) 
+---+---+---+---+ 

Mayormente, FLG.FDICT (bandera del diccionario) no está configurado. En tales casos, el DICTID simplemente no está presente. Entonces, el total de escucha es solo 2 bytes.

Los valores de encabezado (CMF y FLG) sin diccionario se definen de la siguiente manera.

CMF | FLG 
0x78 | 0x01 - No Compression/low 
0x78 | 0x9C - Default Compression 
0x78 | 0xDA - Best Compression 

Más contenido en ZLIB RFC

0

Todas las respuestas aquí son más probablemente correcta, sin embargo - si se quiere manipular la corriente de compresión zlib directamente, y fue producido mediante el uso de gz_open, gzwrite, gzclose funciones - entonces hay 10 bytes principales adicionales cabecera antes de vapor de compresión zlib viene - y los que son producidos por la función gz_open - encabezado se ve así:

fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], 
     Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); 

y resultados en el seguimiento de volcado hexadecimal: 1F 8B 08 00 00 00 00 00 00 0B seguido de la corriente de compresión zlib.

Pero también va a la zaga 8 bytes - Son uLong - CRC sobre todo el archivo, uLong - tamaño del archivo sin comprimir - busque siguientes bytes al final de la secuencia:

putLong (s->file, s->crc); 
    putLong (s->file, (uLong)(s->in & 0xffffffff)); 
4

encabezados zlib/GZIP

Level | ZLIB | GZIP 
    1 | 78 01 | 1F 8B 
    2 | 78 5E | 1F 8B 
    3 | 78 5E | 1F 8B 
    4 | 78 5E | 1F 8B 
    5 | 78 5E | 1F 8B 
    6 | 78 9C | 1F 8B 
    7 | 78 DA | 1F 8B 
    8 | 78 DA | 1F 8B 
    9 | 78 DA | 1F 8B 

desinflado no tiene encabezados comunes

+0

Veo que propuso un cambio considerable en dos respuestas actualmente mejor votadas. Eso cambiaría la respuesta considerablemente. Por favor, no proponga tales ediciones. En su lugar, debe publicar un comentario cuando tenga suficiente reputación. –