zlib数据格式
数据存储
计算机中的字节都是从高到低存储的,即最左边是最高位,最右边是最低位。
但是,一个数可能会占用多个字节,zlib中式高位的字节存在较低的内存之中。例如,十进制数256用两个字节存储在内存中会是下面这种形式:
0 | 1 |
---|---|
00000001 | 00000000 |
数据格式
zlib流采用下面这种结构:
0 | 1 | … |
---|---|---|
CMF | FLG | … |
如果FLG的FDICT位为1,那么最在flag后追加一个4字节的DICTID,如下:
0 | 1 | 2,3,4,5 | … |
---|---|---|---|
CMF | FLG | DICTID | … |
之后,会紧跟着被压缩的数据、数据之后为ADLER32。ADLER32中的数据不属于zlib流中的一部分。
CMF(Compression Method and flags)
这一字节被分割成了两部分。
比特位 | 含义 |
---|---|
0 -3 | CM Compression Method |
4 - 7 | CINFO Compression Info |
CM
表示改文件所用的压缩方法。
CM=8表示deflate压缩方法,它拥有一个最大32K的滑动窗口。这种压缩方法被用于gzip和PNG。
CINFO
如果CM=8,CINFO为LZ77中 l o g 2 ( 滑 动 窗 口 长 度 ) − 8 log_2(滑动窗口长度)-8 log2(滑动窗口长度)−8,例如CINFO=7,那么滑动窗口长度为 2 7 + 8 = 2 15 = 32 K 2^{7+8}=2^{15}=32K 27+8=215=32K
FLG(Flags)
FLG块被分成了三个部分:
比特位 | 含义 |
---|---|
0 - 4 | FCHECK,对CMF和FLG的校验位 |
5 | FDICT,preset dictionary,预置字典 |
6 - 7 | FLEVEL, 压缩等级 |
FCHEK=(CMF*256+FLG),且必须是31的倍数。
FDICT
如果FDICT为1,那么字典标识符会紧跟着FLG之后出现。字典是字典数据的Alder-32校验和,使用这个标志位,解压缩器可以知道压缩程序使用了哪个字典。
FLEVEL
有四种压缩等级。在Deflate方法中,标志为如下:
标志位 | 含义 |
---|---|
0 | 压缩程序使用最快的算法 |
1 | 压缩程序使用较快的算法 |
2 | 压缩程序使用缺少的算法 |
3 | 压缩程序使用最大的压缩,最慢的算法 |
这个标志对于解压程序无用,它的只是用来让人半段有没有必要再进行压缩。
压缩数据
压缩数据采用Deflate格式。
ADLER-32
校验和。
对每一个bit执行记录两个数值,s1是所有比特的和,s2是所有s1的和。二者在计算过程中都要对65521取模。s1初始值为1,s2初始值为0。Adler-32 校验和按高位字节在先(网络字节序)的顺序存储为 s2*65536 + s1。