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