Gzip文件格式分析
Gzip压缩后的文件主要由3个部分组成,分别是文件头、压缩数据部分、文件尾,如图1所示。
其中,文件头包括:固定值,用于Gzip文件格式鉴别;压缩方法,记录压缩时采用的压缩方法;压缩标志,记录操作系统等信息;文件名,记录压缩时文件的名称;CRC16,记录文件头CRC16校验的值,等。
压缩数据部分包括:1个或若干个压缩数据块,压缩数据块可能采用stored模式(直接存储模式,当数据不值得压缩时直接进行存储)、fixed模式(LZ77压缩后的数据采用静态huffman编码)、dynamic模式(LZ77压缩后的数据采用动态huffman编码)之中的一种。Gzip在压缩数据时会采用上述3种模式对数据进行压缩,而存储时则选择一种最优的压缩模式。每个压缩数据块在最开始的3bits(其中前2bits:00,stored;01,fixed;10,dynamic;11:保留位;最后1bits:0,不是最后一个数据块;1:最后一个数据块)中会记录该数据块所采用的压缩模式以及该数据块是否为最后一个数据块,而在解压缩时只需针对性处理即可。
文件尾包括:CRC32,记录原始数据CRC32校验值;ISIZE,记录原始文件数据大小。该部分主要用于对解压缩后的数据进行校验,保证解压缩的正确性。
Gzip解压缩算法流程研究
根据Gzip文件格式可以得出如图2所示的解压缩算法流程:
(1)准备处理待解压缩文件;
(2)对待解压缩文件进行文件头处理,获取压缩方法、压缩标志、文件名等信息;
(3)处理每个块刚开始的3bits,根据处理结果选择进入相应的解压缩模式(stored模式、fixed模式、dynamic模式);