1

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

根据 GZIP规范

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

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

我有两个问题:

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

2 回答 2

5

这并不常见,但您有时会在单个文件中看到串联的 gzip 流。gzip 认为这是单个数据流,而不是多个“文件”,因此忽略文件名。

如果“如何分隔最后一个块”是指最后一个放气块,那么最后一个放气块只是在其标题中有一个位,将其标记为最后一个块。最后一个放气块后面是 crc 和未压缩的长度(模 2^32)。

于 2012-07-18T15:46:40.387 回答
2

如何划分成员?

成员没有分隔。它们之间没有分离,这就是为什么您可以cat像使用非 gzip 压缩文件一样将文件压缩在一起的原因。但是,一旦到达一个成员的末尾,您可以查找指示下一个成员开始的 ID1 和 ID2 值。从规范:

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

这使您可以在文件末尾告诉除垃圾之外的另一个成员的开始。

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

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

gzipped WARC 文件(用于存档网站)很常见。每条记录都是一个单独的成员,以便于查找。但是,该格式不依赖此功能。

于 2017-03-18T06:35:59.740 回答