Search code examples
headerstructurezlib

What does a zlib header look like?


In my project I need to know what a zlib header looks like. I've heard it's rather simple but I cannot find any description of the zlib header.

For example, does it contain a magic number?


Solution

  • Link to RFC

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

    CMF (Compression Method and flags) This byte is divided into a 4-bit compression method and a 4- bit information field depending on the compression method.

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

    CM (Compression method) This identifies the compression method used in the file. CM = 8 denotes the "deflate" compression method with a window size up to 32K. This is the method used by gzip and PNG and almost everything else. CM = 15 is reserved.

    CINFO (Compression info) For CM = 8, CINFO is the base-2 logarithm of the LZ77 window size, minus eight (CINFO=7 indicates a 32K window size). Values of CINFO above 7 are not allowed in this version of the specification. CINFO is not defined in this specification for CM not equal to 8.

    In practice, this means the first byte is almost always 78 (hex)

    FLG (FLaGs) This flag byte is divided as follows:

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

    The FCHECK value must be such that CMF and FLG, when viewed as a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), is a multiple of 31.

    FLEVEL (Compression level) These flags are available for use by specific compression methods. The "deflate" method (CM = 8) sets these flags as follows:

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