¿Cómo se ve un encabezado zlib?

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.

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

Enlace a RFC

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

CMF (Indicador y método de compresión) Este byte se divide en un método de compresión de 4 bits y un campo de información de 4 bits según el 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) 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 32K. Este es el método utilizado por gzip y PNG y casi todo lo demás. CM = 15 está reservado.

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

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

FLG (FLaGs) Este byte de indicador se divide de la siguiente manera:

 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 ven como un entero sin signo de 16 bits almacenado en orden MSB (CMF * 256 + FLG), sea un múltiplo de 31.

FLEVEL (nivel de compresión) Estos indicadores están disponibles para su uso mediante métodos de compresión específicos. El método “desinflar” ( CM = 8 ) establece estos indicadores de la siguiente manera:

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

zlib encabezados mágicos

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

A continuación se muestra el formato de datos comprimidos Zlib.

  +---+---+ |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) +---+---+---+---+ 

En su mayoría, 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 en ZLIB RFC

Cabeceras 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 

Deflate no tiene encabezados comunes

Sin embargo, todas las respuestas son probablemente correctas. Si desea manipular la stream de compresión ZLib directamente, y fue producida utilizando las gz_open, gzwrite, gzclose , entonces hay un encabezado de 10 bytes adicionales antes de que llegue la compresión zlib steam, y esas son producido por la función gz_open – header 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 da como resultado el siguiente volcado hexadecimal: 1F 8B 08 00 00 00 00 00 00 0B seguido de flujo de compresión zlib.

Pero también hay 8 bytes al final – son uLong – crc sobre todo el archivo, uLong – tamaño de archivo sin comprimir – busque los siguientes bytes al final de la secuencia:

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