![](https://i-blog.csdnimg.cn/blog_migrate/14ad575661e7fefa78c2798e942c7f36.png)
扩展头是由FLG字段决定的,共分为四个部分按照顺序依次是:FEXTRA+FNAME+FCOMMENT+FHCRC,扩展+名字+注释+CRC
FEXTRA | XLEN(2B) | SI1 (1B) | SI2(1B) | LEN (2B) | Data |
FNAME | file name | ‘\0’ | |||
FCOMMENT | comment | ‘\0’ | |||
FHCRC | CRC16 (2B) |
FEXTRA:SI1 SI2 子类型,决定Data部分的内容,SI1=Q SI2=Z 表示data分存放压缩前大小,压缩后大小。
Gzip tail and body 尾和主体
文件尾
文件体
“abcabcabcdeabcdefghijklmnopqrstopqrstuvvvvabcabcabcdeabcdefghijklmnopqrstuv”
使用zip压缩,下面是压缩后的文件,
![](https://i-blog.csdnimg.cn/blog_migrate/05804cc47772e3affc443e8d45554f0c.png)
1F8B: 标识符 ID1 ID2
08 : CM (Compression Method),压缩方式,08表示deflate
08 : FLG (FLaGs),标志位,08表示gzip头后面的扩展部分是带原始文件名
38DA7157 : 这四个字节是时间
02 : XFL (eXtra FLags),压缩级别
00 :windows
6162632E74787400 : 共8个字节,文件名“abc.txt”,末尾还有个'\0'表示结束
45 2D F1 80 : 这四个字节是CRC32校验码,转换成正常读取的顺序“80 F1 2D 45”,
原文件内容为“abcabcabcdeabcdefghijklmnopqrstopqrstuvvvvabcabcabcdeabcdefghijklmnopqrstuv”,使用CRC计算:
4B 00 00 00 :这四个字节是原始文件的大小,网络字节序,即4B=75
body部分格式由deflat 决定
一个大的文件会切分成64KB一个快进行压缩,
每一个压缩块都必须有一个块首部,但是每一个压缩块在最终输出的时候,下面三种编码格式(存储、静态、动态)只能用一种。块首部只用三比特(3bits)来表示,
第一比特 BFINAL
后续两比特 BTYPE
BFINAL这一位如果置上(该位置一),表示这是最后一个压缩块,如果没置上(该位是0),表示这个压缩块后面还有后续的压缩块。BTYPE这两位表示本块所使用的编码方式,具体定义如下,
静态哈夫曼编码的压缩文件块首部后面紧跟着就是经过静态哈夫曼编码的二进制码流,即比特流。例如对文件内容为“aaaaaaaaaaaaaaaaa”的文件进行压缩:
4B之前是头部加文件名,末尾8字节是尾。
实际压缩后的数据是:4B 44 07 00
“0100 1011”第8bit=1表示是最后一个压缩快 6-7bit表示BTYPE BTYPE=01 则表示静态哈夫曼,剩下的bit就是数据流。
01001倒序后和0x44组合成: 1 00100010 0010