Como é um header zlib?

No meu projeto eu preciso saber como é um header zlib . Ouvi dizer que é bastante simples, mas não consigo encontrar nenhuma descrição do header zlib.

Por exemplo, ele contém um número mágico?

    Link para o RFC

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

    CMF (método de compactação e sinalizadores) Esse byte é dividido em um método de compactação de 4 bits e um campo de informações de 4 bits, dependendo do método de compactação.

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

    CM (método de compactação) Isso identifica o método de compactação usado no arquivo. CM = 8 denota o método de compactação “deflate” com um tamanho de janela de até 32K. Este é o método usado pelo gzip e PNG e quase todo o resto. CM = 15 é reservado.

    CINFO (Info de compression) Para CM = 8, CINFO é o logaritmo de base 2 do tamanho da janela LZ77, menos oito (CINFO = 7 indica um tamanho de janela de 32K). Valores de CINFO acima de 7 não são permitidos nesta versão da especificação. CINFO não está definido nesta especificação para CM diferente de 8.

    Na prática, isso significa que o primeiro byte é quase sempre 78 (hex)

    FLG (FLaGs) Esse byte de flag é dividido da seguinte maneira:

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

    O valor FCHECK deve ser tal que CMF e FLG, quando visualizados como um inteiro não assinado de 16 bits armazenado na ordem MSB (CMF * 256 + FLG), seja um múltiplo de 31.

    FLEVEL (nível de compactação) Esses sinalizadores estão disponíveis para uso por methods de compactação específicos. O método “deflate” ( CM = 8 ) define esses sinalizadores da seguinte maneira:

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

    headers mágicos zlib

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

    A seguir, o formato de dados compactados do 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) +---+---+---+---+ 

    Principalmente, FLG.FDICT (Flag do dictionary) não está definido. Em tais casos, o DICTID simplesmente não está presente. Então, o total de audição é de apenas 2 bytes.

    Os valores de header ( CMF e FLG ) sem dictionary são definidos da seguinte forma.

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

    Mais em ZLIB RFC

    Cabeçalhos 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 

    Esvaziar não tem headers comuns

    Todas as respostas aqui estão provavelmente corretas, no entanto – se você quiser manipular o stream de compactação ZLib diretamente, e ele foi produzido usando gz_open, gzwrite, gzclose – então há um header extra de 10 bytes antes da compactação zlib chegar – e essas são produzido pela function gz_open – header se parece com isto:

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

    E resulta no seguinte dump hexadecimal: 1F 8B 08 00 00 00 00 00 00 0B seguido por stream de compression zlib.

    Mas há também oito bytes – eles são uLong – crc sobre todo o arquivo, uLong – tamanho do arquivo descomprimido – procure os seguintes bytes no final do stream:

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