【发布时间】:2011-10-17 07:28:12
【问题描述】:
我正在使用一些 zip 和 rar 文件,我正在尝试分析每个文件的压缩属性(压缩级别、压缩算法(例如 deflate、LZMA、BZip2)、字典大小,字长等),我还没有想出办法做到这一点。
有没有什么方法可以通过软件或其他方式分析文件以确定这些属性?
干杯,谢谢!
【问题讨论】:
标签: algorithm compression zip rar
我正在使用一些 zip 和 rar 文件,我正在尝试分析每个文件的压缩属性(压缩级别、压缩算法(例如 deflate、LZMA、BZip2)、字典大小,字长等),我还没有想出办法做到这一点。
有没有什么方法可以通过软件或其他方式分析文件以确定这些属性?
干杯,谢谢!
【问题讨论】:
标签: algorithm compression zip rar
类型很简单,只看文件头(PK 和Rar)。
至于其余部分,我怀疑压缩内容中是否提供信息。
【讨论】:
我建议hachoir-wx 看看这些文件。 How to install a Python package 或者您可以在使用 Windows 时尝试使用 PyPM 使用 ActivePython。当您安装了必要的 hachoir 包后,您可以执行以下操作来运行 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 文件,我将首先查看 specifications 和 ZIP Wikipedia page。这些可能很有趣:
general purpose bit flag: (2 bytes)
compression method: (2 bytes)
【讨论】:
对于 ZIP 文件,有一个命令 zipinfo。
【讨论】:
对于 ZIP - 是的,zipinfo
对于 RAR,可以使用 7Zip 或 WinRAR 轻松找到标头,请阅读随附的文档
【讨论】:
这是一个相当老的问题,但我还是想投入两分钱,因为上面的一些方法对我来说并不容易使用。
您也可以使用 7-Zip 来确定这一点。打开存档后有一个压缩方法栏:
【讨论】:
通过 7-Zip(或 p7zip)命令行:
7z l -slt archive.file
如果专门寻找压缩方式:
7z l -slt archive.file | grep -e '^---' -e '^Path =' -e '^Method ='
【讨论】:
zipfile python 模块可用于获取有关压缩文件的信息。
ZipInfo 类提供filename、compress_type、compress_size、file_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 模块可能有帮助
【讨论】: