GZIP文 件格式简介

news/2024/10/20 11:49:36/
标题  GZIP文 件格式简介     选择自 bhw98 的 Blog
关键字  GZIP, ZLIB, DEFLATE, 文件格式
出处 
 

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

GZIP本身只是一种文件格式,其内部通常采用DEFLATE数据格式,而DEFLATE采用LZ77压缩算法来压缩数据。

GZIP文件由1到多个“块”组成,实际上通常只有1块。每个块包含头、数据和尾三部分。块的概貌如下:

+---+---+---+---+---+---+---+---+---+---+========//========+===========//==========+---+---+---+---+---+---+---+---+
|ID1|ID2| CM|FLG|     MTIME     |XFL| OS|   额外的头字段   |       压缩的数据      |     CRC32     |     ISIZE     |
+---+---+---+---+---+---+---+---+---+---+========//========+===========//==========+---+---+---+---+---+---+---+---+

1. 头部分

  • ID1与ID2:各1字节。固定值,ID1 = 31 (0x1F),ID2 = 139(0x8B),指示GZIP格式。
  • CM:1字节。压缩方法。目前只有一种:CM = 8,指示DEFLATE方法。
  • FLG:1字节。标志。

    bit 0 FTEXT - 指示文本数据
    bit 1 FHCRC - 指示存在CRC16头校验字段
    bit 2 FEXTRA - 指示存在可选项字段
    bit 3 FNAME - 指示存在原文件名字段
    bit 4 FCOMMENT - 指示存在注释字段
    bit 5-7 保留

  • MTIME:4字节。更改时间。UINX格式。
  • XFL:1字节。附加的标志。当CM = 8时,XFL = 2 - 最大压缩但最慢的算法;XFL = 4 - 最快但最小压缩的算法
  • OS:1字节。操作系统,确切地说应该是文件系统。有下列定义:

    0 - FAT文件系统 (MS-DOS, OS/2, NT/Win32)
    1 - Amiga
    2 - VMS/OpenVMS
    3 - Unix
    4 - VM/CMS
    5 - Atari TOS
    6 - HPFS文件系统 (OS/2, NT)
    7 - Macintosh
    8 - Z-System
    9 - CP/M
    10 - TOPS-20
    11 - NTFS文件系统 (NT)
    12 - QDOS
    13 - Acorn RISCOS
    255 - 未知

  • 额外的头字段:

    (若 FLG.FEXTRA = 1)

    +---+---+---+---+===============//================+
    |SI1|SI2|  XLEN |      长度为XLEN字节的可选项     |
    +---+---+---+---+===============//================+
    

    (若 FLG.FNAME = 1)

    +=======================//========================+
    |               原文件名(以NULL结尾)              |
    +=======================//========================+
    

    (若 FLG.FCOMMENT = 1)

    +=======================//========================+
    |   注释文字(只能使用iso-8859-1字符,以NULL结尾)  |
    +=======================//========================+
    

    (若 FLG.FHCRC = 1)

    +---+---+
    | CRC16 |
    +---+---+
    

    存在额外的可选项时,SI1与SI2指示可选项ID,XLEN指示可选项字节数。如 SI1 = 0x41 ('A'),SI2 = 0x70 ('P'),表示可选项是Apollo文件格式的额外数据。

    2. 数据部分

    DEFLATE数据格式,包含一系列子数据块。子块概貌如下:

    +......+......+......+=============//============+
    |BFINAL|    BTYPE    |            数据           |
    +......+......+......+=============//============+
    
  • BFINAL:1比特。0 - 还有后续子块;1 - 该子块是最后一块。
  • BTYPE:2比特。00 - 不压缩;01 - 静态Huffman编码压缩;10 - 动态Huffman编码压缩;11 - 保留。

    各种情形的处理过程,请参考后面列出的RFC文档。

    3. 尾部分

  • CRC32:4字节。原始(未压缩)数据的32位校验和。
  • ISIZE:4字节。原始(未压缩)数据的长度的低32位。

    GZIP中字节排列顺序是LSB方式,即Little-Endian,与ZLIB中的相反。

    下面是GZIP文件 gzip-1.3.3.tar.gz 格式的简要分析示意图:

    GZIP文件格式示意图

    GZIP与ZLIB有着很深的渊源。有关ZLIB, GZIP以及DEFLATE等更加详细的说明,可参考RFC 1950-1952。从这些文档里也能找到其它的参考文献。

    GZIP已成为GNU Project的一个组成部分,其官方站点为www.gzip.org。在这里可以下载到GZIP源码。目前最新版本是1.2.4,以及beta版的1.3.3。

     

    [相关资源]

  • GZIP官方网站:www.gzip.org
  • RFC 1950 - ZLIB Compressed Data Format Specification version 3.3
  • RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3
  • RFC 1952 - GZIP file format specification version 4.3
  • 科脑工作室(Kernel Studio):www.kernelstudio.com
 

http://www.ppmy.cn/news/546990.html

相关文章

实训五:数据库安全控制 - MySQL-安全性控制

MySQL-安全性控制 第1关:用户和权限任务描述相关知识MySQL的安全控制机制用户(User)权限角色(Role)GRANT授权语句REVOKE收回权限语句 编程要求测试说明参考代码 第2关:用户、角色与权限任务描述相关知识编程要求测试说明参考代码 第1关:用户和…

5.5.4 从IPv4到IPv6过渡——双协议栈

5.5.4 从IPv4到IPv6过渡——双协议栈 与软件版本更新不同,IP协议版本的更新不可能在短时间内完成,只能够采用逐步演进的方法,也就是说在很长一段时间内,必须允许两种协议的网络并存,并且能够确保网络能够互联互通&…

C# 文件的压缩与解压缩

依赖:.NET Framework 4.5及以上,引用 - 添加引用 - 程序集 System.IO.Compression System.IO.Compression.FileSystem —————————————————————————————— 针对文件夹的最简单的压缩与解压缩 1、目录必须存在 2、无法覆盖文…

虚拟机解压缩命令

虚拟机解压缩命令 1、.tar 用 tar –xvf 解压 2、.gz 用 gzip -d或者gunzip 解压 3、.tar.gz和.tgz 用 tar –xzf 解压 4、.bz2 用 bzip2 -d或者用bunzip2 解压 5、.tar.bz2用tar –xjf 解压 6、.Z 用 uncompress 解压 7、.tar.Z 用tar –xZf 解压 8、.rar 用 unrar e解压 9、…

tar 打包压缩与解压缩

tar 命令用于对文件进行打包压缩或解压缩。 在Linux系统中,常见的压缩包文件格式有很多,其中主要使用的是 .tar 或 .tar.gz 或 .tar.bz2 的格式。 1、tar 命令的参数 -c 创建压缩文件 -x 解压缩文件 -t 查看压缩包内有哪些文件 -z 使用 Gzi…

windows自带的压缩/解压缩(zip/unzip)功能-Powershell 的应用之一

压缩文件经常碰到, 一般可以下载免费的unzip软件, 但是要么很多广告,要么用一段时间就要购买。 其实windows自动的Powershell 就可以做压缩和解压的。 Powershell 是微软用于计算机管理的一个工具,很多方面与CMD 类似&#xff0c…

golang zip压缩/解压缩用法

最近有个需求,需要写个脚本,但要编译为exe可执行文件,首先考虑python打包,奈何使用pyinstaller打包后,出现各种各样的运行错误,最后放弃了,改为golang重写。因为要用到创建和解压zip文件&#x…

C语言实现哈夫曼压缩与解压缩的实现以及读取哈夫曼编码 万文长书,绝对详细哦

哈夫曼压缩与解压缩的实现 开始之前,务必要看!看了能更好的理解代码一、整体的布局二、模块功能实现1、压缩2、解压缩 三、尾记-主函数的详细介绍 开始之前,务必要看!看了能更好的理解代码 为了伙伴们更好的理解我们这个代码的实…