什么是zlib标题?

在我的项目中,我需要知道什么是zlib标题。 我听说这很简单,但我找不到zlib标题的任何描述。

例如,它是否包含一个幻数?

链接到RFC

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

CMF(压缩方法和标志)根据压缩方法,该字节被分成4位压缩方法和4位信息字段。

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

CM(压缩方法)这标识文件中使用的压缩方法。 CM = 8表示窗口大小高达32K的“放气”压缩方法。 这是gzip和PNG 以及其他几乎所有的方法。 CM = 15被保留。

CINFO(压缩信息)对于CM = 8,CINFO是LZ77窗口大小的基数2对数减8(CINFO = 7表示32K窗口大小)。 在这个版本的规范中不允许CINFO值大于7。 CINFO在本规范中没有定义,CM不等于8。

实际上,这意味着第一个字节几乎总是78 (hex)

FLG(FLaGs)该标志字节分为以下几部分:

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

FCHECK值必须是CMF和FLG,当以MSB顺序(CMF * 256 + FLG)存储的16位无符号整数查看时,是31的倍数。

FLEVEL(压缩级别)这些标志可供特定压缩方法使用。 “放气”方法( CM = 8 )设置这些标志如下:

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

zlib魔术标题

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

以下是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) +---+---+---+---+ 

大多数情况下, FLG.FDICT (字典标志)未设置。 在这种情况下, DICTID根本就不存在。 所以,听到的只有2个字节。

无字典的标题值( CMFFLG )定义如下。

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

更多在ZLIB RFC

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 

放气没有共同的标题

这里的所有答案都可能是正确的,但是 – 如果你想直接操作ZLib压缩stream,而且它是使用gz_open, gzwrite, gzclose函数生成的 – 那么在zlib压缩之前会有额外的10个前导字节头,由函数gz_open生成 – 头文件如下所示:

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

结果如下hex转储: 1F 8B 08 00 00 00 00 00 00 0B然后是zlib压缩stream。

但是也有8个字节 – 它们是整个文件的uLong -crc, uLong – 未压缩的文件大小 – 在数据stream结束时查找以下字节:

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