我想知道如何确定单个文件中包含多少个zlib文件。
一个例子;我想我有5个不同的文件,并使用zlib分别压缩它们。然后我把它们合并了。所以,我有一个文件包含5个不同的zlib文件。现在,我怎样才能找到该单个文件中有多少个zlib文件?我只需要在单个文件中找出zlib文件的数量。我想,我需要转储它的十六进制代码并grep一些神奇的数字,但无法弄清楚如何做到这一点。
你能救我吗?
块的长度不存储在zlib编码数据中(non-compressed block除外)。相反,块的结尾由流中的标记[256]表示。但是这个标记是霍夫曼编码的,而霍夫曼编码通常是dynamically generated所以它对于每个块可以是不同的。此外,编码的令牌可能从字节的任何位开始,因此无法“grep”它。找到块令牌结束的唯一方法是解码整个块并检查您何时点击此令牌。
我认为您应该看看您的容器是否包含任何长度信息,并使用它来查找压缩数据的长度。
如果您的单个文件是串联多个gzip文件,那么您可以找到文件数量的上限。 Gzip格式从神奇的0x1f8b
开始。
计算单个文件中魔术的出现次数。计数表示您最多拥有这么多文件。不幸的是,它是一个上限而不是确切数量的文件。因为0x1f8b
也可能在64K字节中偶然出现在数据部分中。要将错误匹配减少到1~2400万字节,您可以扫描0x1f8b08
。尾随0x08
是“压缩方法”字段,始终为8。
可以进一步改进这种“过滤器”。请参阅RFC1952的FLG字段。
如果单个文件的成员不是gzip格式,而是Zlib或原始格式,那么你运气不好;你必须解压缩来计算文件的数量 - 无论如何我都会这样做。