【问题标题】:How can I find how many zlib files are in a single zlib file?如何查找单个 zlib 文件中有多少个 zlib 文件?
【发布时间】:2010-08-13 23:16:57
【问题描述】:

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

一个例子;认为我有 5 个不同的文件,并使用 zlib 分别压缩它们。然后我把它们结合起来。所以,我有一个文件包含 5 个不同的 zlib 文件。现在,我怎样才能找到该单个文件中有多少个 zlib 文件?我只需要找出单个文件中 zlib 文件的数量。我想,我需要转储它的十六进制代码并 grep 一些幻数,但不知道该怎么做。

你能帮帮我吗?

【问题讨论】:

    标签: binary hex zlib


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我知道。让我这样说吧;我有一个包含多个 zlib 文件的容器。如何找到该容器中有多少个 zlib 文件?
    • @merinn:你用的是什么“容器”?我觉得容器的格式比zlib的格式更重要。
    • @merinn:Zlib 不压缩文件 - 它压缩数据。没有“zlib 文件”之类的东西。
    【解决方案2】:

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

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

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

    如果单个文件的成员不是 gzip 格式,而是 Zlib 或 raw 格式,那你就倒霉了;您必须解压缩才能计算文件的数量-无论如何我都会这样做。

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多