【问题标题】:How to determine compression method of a ZIP/RAR file如何确定 ZIP/RAR 文件的压缩方法
【发布时间】:2011-10-17 07:28:12
【问题描述】:

我正在使用一些 zip 和 rar 文件,我正在尝试分析每个文件的压缩属性(压缩级别、压缩算法(例如 deflate、LZMA、BZip2)、字典大小,字长等),我还没有想出办法做到这一点。

有没有什么方法可以通过软件或其他方式分析文件以确定这些属性?

干杯,谢谢!

【问题讨论】:

    标签: algorithm compression zip rar


    【解决方案1】:

    类型很简单,只看文件头(PKRar)。

    至于其余部分,我怀疑压缩内容中是否提供信息。

    【讨论】:

    • 是的,它是可用的(至少对于 rar)。但如何获取显然取决于具体的文件格式。
    • 如果信息不可用,就无法解压数据。
    【解决方案2】:

    我建议hachoir-wx 看看这些文件。 How to install a Python package 或者您可以在使用 Windows 时尝试使用 PyPM 使用 ActivePython。当您安装了必要的 hach​​oir 包后,您可以执行以下操作来运行 GUI:

    python C:\Python27\Scripts\hachoir-wx

    它使您能够浏览 RAR 和 ZIP 文件的数据字段。有关示例,请参阅此 screenshot

    对于 RAR 文件,请查看 WinRAR 安装目录中的 technote.txt 文件。这给出了 RAR 规范的详细信息。您可能会对这些感兴趣:

     HEAD_FLAGS      Bit flags: 2 bytes
                     0x10 - information from previous files is used (solid flag)
                     bits 7 6 5 (for RAR 2.0 and later)
                          0 0 0    - dictionary size   64 KB
                          0 0 1    - dictionary size  128 KB
                          0 1 0    - dictionary size  256 KB
                          0 1 1    - dictionary size  512 KB
                          1 0 0    - dictionary size 1024 KB
                          1 0 1    - dictionary size 2048 KB
                          1 1 0    - dictionary size 4096 KB
                          1 1 1    - file is directory
    

    字典大小也可以在 WinRAR GUI 中找到。

     METHOD          Packing method 1 byte
                     0x30 - storing
                     0x31 - fastest compression
                     0x32 - fast compression
                     0x33 - normal compression
                     0x34 - good compression
                     0x35 - best compression
    

    Wikipedia 也知道这一点:

    RAR 压缩实用程序是专有的,具有封闭的算法。 RAR 由 Eugene Roshal 的哥哥 Alexander L. Roshal 所有。 RAR 第 3 版基于 Lempel-Ziv (LZSS) 和通过部分匹配 (PPM) 压缩进行预测,特别是 Dmitry Shkarin 的 PPMII 的 PPMd 实现。

    对于 ZIP 文件,我将首先查看 specificationsZIP Wikipedia page。这些可能很有趣:

      general purpose bit flag: (2 bytes)
      compression method: (2 bytes)
    

    【讨论】:

    • 第一个文件的 METHOD 字节通常位于偏移量 0x2D。
    【解决方案3】:

    对于 ZIP 文件,有一个命令 zipinfo。

    【讨论】:

    • 当我将它输入到我的控制台时,它说没有找到这样的命令。
    【解决方案4】:

    对于 ZIP - 是的,zipinfo

    对于 RAR,可以使用 7Zip 或 WinRAR 轻松找到标头,请阅读随附的文档

    【讨论】:

    • 感谢您的提示!我需要找出 MS Word 在生成 .DOCX 文件时使用的 ZIP 设置。 DOCX 文件是一个 ZIP 存档,包含多个 XML 文件和嵌入的媒体文件。这些您可以使用您选择的工具进行批处理,但最后您需要使用 MS Word 接受的设置将其重新打包为 ZIP 文件!我使用 zipinfo 分析 MS Word 编写的 DOCX 文件。如果我对 DOCX ZIP 格式得出最终结论,我会在这里发布。
    【解决方案5】:

    这是一个相当老的问题,但我还是想投入两分钱,因为上面的一些方法对我来说并不容易使用。

    您也可以使用 7-Zip 来确定这一点。打开存档后有一个压缩方法栏:

    【讨论】:

    • Windows 文件资源管理器也提供此列;虽然您可能需要在打开 zip 后添加它...右键单击表格标题并确保勾选/选中“方法”选项。
    【解决方案6】:

    通过 7-Zip(或 p7zip)命令行:

    7z l -slt archive.file
    

    如果专门寻找压缩方式:

    7z l -slt archive.file | grep -e '^---' -e '^Path =' -e '^Method ='
    

    【讨论】:

    【解决方案7】:

    zipfile python 模块可用于获取有关压缩文件的信息。 ZipInfo 类提供filenamecompress_typecompress_sizefile_size 等信息...

    Python sn-p 获取 zip 存档中的文件名和文件的压缩类型

    import zipfile
    
    with zipfile.ZipFile(path_to_zipfile, 'r') as zip:
        for info in zip.infolist():
            print(f'filename: {info.filename}')
            print(f'compress type: {info.compress_type}')
    

    这将列出所有文件名及其对应的压缩类型(整数),可用于查找压缩方法。
    您可以使用 infolist() 获得更多关于文件的info

    已接受答案中链接的 python 模块不可用,zipfile 模块可能有帮助

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多