zlib数据格式分析(RFC-1950)

zlib数据格式

数据存储

计算机中的字节都是从高到低存储的,即最左边是最高位,最右边是最低位。

但是,一个数可能会占用多个字节,zlib中式高位的字节存在较低的内存之中。例如,十进制数256用两个字节存储在内存中会是下面这种形式:

01
0000000100000000

数据格式

zlib流采用下面这种结构:

01
CMFFLG

如果FLG的FDICT位为1,那么最在flag后追加一个4字节的DICTID,如下:

012,3,4,5
CMFFLGDICTID

之后,会紧跟着被压缩的数据、数据之后为ADLER32。ADLER32中的数据不属于zlib流中的一部分。

CMF(Compression Method and flags)

这一字节被分割成了两部分。

比特位含义
0 -3CM Compression Method
4 - 7CINFO 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 - 4FCHECK,对CMF和FLG的校验位
5FDICT,preset dictionary,预置字典
6 - 7FLEVEL, 压缩等级

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值