header - name - meta tags seo
¿Cómo se ve un encabezado zlib? (5)
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?
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 corriente 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));
zlib encabezados mágicos
78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression
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