2010-08-13 79 views
1

我想知道如何确定一个文件中包含多少个zlib文件。如何查找一个zlib文件中有多少个zlib文件?

一个例子;认为我有5个不同的文件,并使用zlib单独压缩它们。然后我结合他们。所以,我有一个文件包含5个不同的zlib文件。现在,我怎样才能找到这个文件中有多少个zlib文件?我只需要在一个文件中找出zlib文件的数量。我想,我需要转储它的十六进制代码和grep一些神奇的数字,但无法弄清楚如何做到这一点。

你能帮我吗?

回答

2

块的长度未存储在zlib编码数据中(non-compressed block除外)。相反,块的结尾由流中的标记[256]表示。但是这个标记是霍夫曼编码的,霍夫曼编码通常是dynamically generated,所以它对于每个块可以是不同的。此外,编码的令牌可能从字节的任何位开始,因此无法“grep”它。查找块标记结束的唯一方法是对整个块进行解码并检查以查看您何时点击该标记。

我想你应该看看你的容器是否包含任何长度信息,并用它来找出压缩数据的时间长度。

有关zlib格式的详细信息,请参见RFC 1950以及相关的DEFLATE规范,即RFC 1951

+0

是的,我知道。让我这样说吧;我有一个容器有多个zlib文件。我如何查找该容器中有多少个zlib文件? – merinn 2010-08-13 23:25:58

+0

@merinn:你在使用什么“容器”?我认为容器的格式比zlib的格式更重要。 – 2010-08-13 23:31:14

+0

@merinn:Zlib不压缩文件 - 压缩数据。没有'zlib文件'这样的东西。 – 2010-08-13 23:40:13

1

如果您的单个文件是多个gzip文件的串联,那么您可以找到文件数量的上限。 Gzip格式以魔术0x1f8b开头。

计算单个文件中魔术的出现次数。计数表明您最多只有很多文件。不幸的是,这是一个上限而不是确切数量的文件。因为0x1f8b也可能出现在64K字节的数据段中。为了减少约24万字节中的1个错误匹配,您可以改为扫描0x1f8b08。尾部0x08是始终为8的“压缩方法”字段。

该“过滤器”的进一步改进是可能的。请参阅RFC1952的FLG字段。

如果单个文件的成员不是gzip格式,但是Zlib或raw格式,那么你运气不好;你必须解压才能计算文件的数量 - 不管我怎么做。