GZIP&Deflate 压缩格式

Gzip 是一种压缩工具, 或者说它是一种文件格式。
我把 gzip 文件格式理解为一只虾,一只虾分成三个部分:头、中间、尾巴
Gzip 文件头
Gzip extend Header 扩展头

扩展头是由FLG字段决定的,共分为四个部分按照顺序依次是:FEXTRA+FNAME+FCOMMENT+FHCRC扩展+名字+注释+CRC

FEXTRA

XLEN2B

 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 尾和主体

文件尾

Gzip 文件尾由 8 个字节构成
CRC32 Cyclic Redundancy Check 4 字节,用标准循环冗余校验算法对原始数据进行计算的结果
ISIZE InputSIZE 4 字节,将原始数据大小对 2^32 取模的结果(因为只能用四个字节存结果,所以只能对 2^32 取模)

文件体

文件体本身与 gzip 没多大关系了,因为只要用到 deflate 的文件格式,这部分都是一样的,比如 gzip 的文件体和 PKzip 的文件体“基本”是一样的,因为它们都使用了 deflate 。换句话说,这部分的格式就全部由 deflate 算法(或格式)决定了
•举例
有一段文字

abcabcabcdeabcdefghijklmnopqrstopqrstuvvvvabcabcabcdeabcdefghijklmnopqrstuv

使用zip压缩,下面是压缩后的文件,

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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luopandeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值