如何划分GZIP文件中的块?

时间:2012-07-18 12:31:27

标签: c gzip

我正在为学习目的而编写一个解压缩GZIP文件的C程序。

根据GZIP spec

  

gzip文件由一系列“成员”(压缩数据集)组成。   每个成员的格式在以下部分中指定。该   成员只是在文件中一个接一个地出现,没有   在它们之前,之间或之后的附加信息。

并且一个成员由标题组成(可能具有可选字段,具体取决于某些标志值),一些压缩块(使用deflate算法),最后是CRC32和原始未压缩文件的大小。

我有两个问题:

  1. 如何划分成员?实际上,一个gzip文件中真的有多个成员吗?似乎一个成员对应于一个文件(例如文件名头)
  2. 如何界定预告片中的最后一个块(CRC + SIZE)?

2 个答案:

答案 0 :(得分:5)

这种情况并不常见,但有时您会在单个文件中看到串联的gzip流。 gzip认为这是一个单一的数据流,而不是多个"文件",所以文件名被忽略。

如果通过"如何划分最后一个块"你的意思是最后一个deflate块,然后最后一个deflate块在它的标题中只有一个位,标志着它作为最后一个块。最后一个deflate块后跟crc和未压缩长度(模2 ^ 32)。

答案 1 :(得分:2)

  

如何划分成员?

会员没有分隔。它们之间没有分离,这就是为什么你可以{non} gzip压缩文件的方式cat将文件压缩在一起的原因。但是,一旦你到达一个成员的末尾,你可以找到ID1& ID2值,指示下一个成员的开始。来自规范:

  

它们具有固定值ID1 = 31(0x1f,\ 037),ID2 = 139(0x8b,\ 213),以将文件标识为gzip格式。

这可以让你告诉另一个成员的开头,除了文件末尾的垃圾。

如果您希望跳转到文件中的特定成员而不阅读所有其他成员,则可以使用预先计算的索引,例如CDX file provides

  

实际上,一个gzip文件中确实有多个成员吗?

gzipped WARC files(用于存档网站)非常常见。每条记录都是一个单独的成员,使寻求更容易。但是,格式并不依赖于此功能。