我正在为学习目的而编写一个解压缩GZIP文件的C程序。
根据GZIP spec
gzip文件由一系列“成员”(压缩数据集)组成。 每个成员的格式在以下部分中指定。该 成员只是在文件中一个接一个地出现,没有 在它们之前,之间或之后的附加信息。
并且一个成员由标题组成(可能具有可选字段,具体取决于某些标志值),一些压缩块(使用deflate算法),最后是CRC32和原始未压缩文件的大小。
我有两个问题:
答案 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(用于存档网站)非常常见。每条记录都是一个单独的成员,使寻求更容易。但是,格式并不依赖于此功能。