The zlib compressed da
The deflate compression algorithm is described at http://www.ietf.org/rfc/rfc1951.txt
CMF(1Byte) | FLG(1Byte) | DICTID | Compressed Da | Adler32(4Byte) |
CM | CINFO | FCHECK | FDICT | FLEVEL |
|
|
|
CMF ( Compressed Method and Flag ) :1个字节。这个字节由两部分组成,一部分为低4位的压缩方法(CM),另一部分为高4位的压缩信息(CINFO)。
CM(Compressed Method):即压缩方法。标明在此压缩文件中所采用的压缩方法。CM=8表示在32位windows中使用的deflate压缩方法。GZIP 和 PNG使用的就是这种压缩方法。CM=15为保留值,可能会在以后的版本中在压缩数据之前使用来指明存在一个扩展。
CINFO(Compression info):压缩信息。对于CM=8,CINFO是以2为底,LZ77 window大小的对数,-8(即7表示是32位window大小)。在本版本的说明文档中,大于7的CINFO都是非法的。对于CM不等于8的值,本说明文档中CINFO都为未定义的。
FLG(FlaGs):1个字节。这个字节分为三部分,低5位为FCHECK,高两位为FLEVEL,中间一位为FDICT。
FCHECK:
FDICT(Preset dictionary):如果设置了FDICT,则FLG字节之后就是一个DICT字典标识符。字典由一系列字节组成,在压缩开始时提供给压缩器使用,而不用产生任何压缩后的输出。DICT就是这组序列字节的Adler32校验码。解压器可以通过此码来判别压缩器使用的是哪个字典。
FLEVEL(Compression level):这些标记只针对指定的压缩方法才有效。”deflate”方法(CM=8)设置的标记如下:
0 —压缩器使用最快速算法
1 —压缩器使用快速算法
2 —压缩器使用默认的算法
3 —压缩器使用质量最高压缩,速度最慢算法
解压缩时并不需要FLEVEL的信息;只是用来说明是否值得重新压缩。
Compressed Da
Adler32(Adler-32 checksum):4个字节。这个字段包含的是根据Alder-32算法计算出来的未压缩数据(不包括任何的字典数据)的校验和。Adler-32是由对每个字节计算所得出的两个和所组成的:S1是所有字节的和,S2是所有S1的和。两个和都要对65521取模。S1初始化为1,S2初始化为0。Adler-32校验和以S2*65536 + S1的形式,按照最高加权位第一(MSB)的顺序存储