如何在单个zlib文件中找到多少个zlib文件?

问题描述 投票:1回答:2

我想知道如何确定单个文件中包含多少个zlib文件。

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

你能救我吗?

binary hex zlib
2个回答
2
投票

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

我认为您应该看看您的容器是否包含任何长度信息,并使用它来查找压缩数据的长度。

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


1
投票

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

计算单个文件中魔术的出现次数。计数表示您最多拥有这么多文件。不幸的是,它是一个上限而不是确切数量的文件。因为0x1f8b也可能在64K字节中偶然出现在数据部分中。要将错误匹配减少到1~2400万字节,您可以扫描0x1f8b08。尾随0x08是“压缩方法”字段,始终为8。

可以进一步改进这种“过滤器”。请参阅RFC1952的FLG字段。

如果单个文件的成员不是gzip格式,而是Zlib或原始格式,那么你运气不好;你必须解压缩来计算文件的数量 - 无论如何我都会这样做。

© www.soinside.com 2019 - 2024. All rights reserved.