PKZ 存档格式是一种专有的压缩存档格式,由 PKWARE, Inc. 开发,用于打包和压缩文件和目录。它通常在 Microsoft Windows 系统上使用,但也可以在其他平台上使用。该格式结合了 DEFLATE 压缩和各种预处理 过滤器,以在平衡速度和内存使用的情况下实现高压缩比。
PKZ 存档由每个文件的系列“本地文件头”、可选的存档解密/加密头、压缩文件数据块、中央目录结构和中央目录记录结尾组成。这允许快速访问各个压缩文件、可选加密、数据完整性检查以及存储有关存档文件元数据的能力。
每个本地文件头都包含有关文件的信息,例如其名称、大小、时间戳、CRC-32 校验和和使用的压缩方法。该头还指定应用于文件的任何可选功能,例如加密、预处理过滤器、修补或跨多个存档跨越数据。本地头后跟压缩或存储的文件数据。
PKZ 支持多种压缩方法,其中 DEFLATE 最为常见。DEFLATE 是一种无损数据压缩算法,它结合了 LZ77 压缩和霍夫曼编码。如果需要,PKZIP 还可以存储不带压缩的文件。在极少数情况下,可以使用其他旧版压缩方法,例如 LZMA 或 Bzip2。
在使用 DEFLATE 压缩文件之前,可以应用各种预处理过滤器来提高压缩率。这些方法包括减小符号大小、交换字节以增加冗余、可执行文件的 BCJ 过滤器以及增量更新或修补的 delta 过滤器。在将数据传递给 DEFLATE 压缩器之前,这些过滤器将作为压缩过程的一部分应用。
为了进行数据完整性验证,每个文件在其本地头中记录未压缩数据的 CRC-32 校验和。相同的校验和记录在文件的中央目录条目中。这允许验证文件是否已正确压缩和解压缩,并且没有数据损坏。
PKZ 存档可以选择使用对称加密对文件数据和头进行加密。较旧版本使用 ZipCrypto,而较新版本使用 AES 加密。在加密时,所选的加密方法将记录在存档中,并且每个文件都可以指定自己的密码。经过身份验证的加密用于检测加密数据的任何篡改或损坏。
中央目录紧随压缩文件数据之后,充当存档的目录。它包 含每个文件的带有其元数据的文件头条目、指向本地头的偏移量以及解压缩文件所需的其他信息。这些条目按文件名排序。可以将可选的数字签名应用于中央目录,以进一步防止篡改。
最后,中央目录记录结尾标记存档文件的结尾。它存储中央目录中的条目数、其大小和偏移量以及注释字段。对于拆分为多个文件的存档,它还包含有关如何查找其他存档文件的信息。
PKZ 格式允许在无需解压缩整个存档的情况下,高效地随机访问存档中的各个文件。这是通过读取中央目录、找到所需的文件条目,然后从其偏移量读取和解压缩特定的本地文件块来完成的。还可以同时打开和解压缩多个文件。
要创建 PKZ 存档,首先将文件单独过滤并压缩到本地文件块中。中央目录条目是从本地头和文件元数据生成的。然后,根据需要对中央目录进行数字签名。最后,写入指向中央目录的中央目录记录结尾。
提取 PKZ 存档从读取中央目录结尾开始,以找到中央目录条目。找到所需文件的条目,并通过从指定偏移量读取其本地头和压缩数据来解压缩每个条目。删除任何加密,并反转预处理过滤器以获取原始文件内容。
PKZ 格式的其他一些功能包括:将存档拆分为多个文件、卷或段;支持 Unicode 文件名;NTFS 文件系统权限和属性;集成的更新/修补功能;以及可扩展的元数据,例如数字签名、哈希摘要和特定于应用程序的数据。
总体而言,PKZ 格式是一种高效且灵活的存档格式,用于压缩和打包文件。它能够单独压缩文件、应用预处理过滤器以及在不处理整个存档的情况下快速提取特定文件,使其非常适合打包软件安装程序、固件更新、文档等。对加密、数据完整性检查和数字签名的支持还允许它在需要时提供高水平的安全性 。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 1948 年的原始论文《通信的数学理论》)。对于有损压缩,码率与感知质量之间的权衡由率失真理论描述。
大多数压缩器分两步。首先,模型预测或揭示数据中的结构。然后,编码器把这些预测变成近乎最优的比特模式。一个经典的建模家族是 Lempel–Ziv:LZ77 (1977)和 LZ78 (1978) 会检测重复子串并输出引用而不是原始字节。在编码端,霍夫曼编码(见原始论文1952)会为更常见的符号分配更短的代码。算术编码和范围编码能更贴近熵极限,而现代的非对称数值系统(ANS)用 查表实现获得相似的压缩率。
DEFLATE(被 gzip、zlib 与 ZIP 采用)结合了 LZ77 和霍夫曼编码。其规范完全公开:DEFLATERFC 1951、zlib 封装RFC 1950以及 gzip 文件格式RFC 1952。Gzip 面向流式传输并明确不提供随机访问。PNG 图像标准化将 DEFLATE 作为唯一的压缩方法(窗口最多 32 KiB),可见 PNG 规范“Compression method 0… deflate/inflate… at most 32768 bytes”和W3C/ISO PNG 第二版。
Zstandard (zstd): 面向高压缩率与快速解压的通用压缩器。格式记录在RFC 8878(还有HTML 镜像)以及 GitHub 上的参考规范文档。与 gzip 类似,基本帧不追求随机访问。zstd 的拿手好戏是字典:从语料中抽取的小样本能显著改善大量小文件或相似文件的压缩(参见python-zstandard 字典文档与Nigel Tao 的示例)。各实现同时支持“无结构”和“有结构”字典(讨论)。
Brotli: 为网页内容(例如 WOFF2 字体、HTTP)优化,混合静态字典与类似 DEFLATE 的 LZ+熵编码核心。规范见RFC 7932,其中也指出滑动窗口大小为 2WBITS-16,WBITS 取值 [10, 24](1 KiB-16 B 到 16 MiB-16 B),并且不尝试随机访问。Brotli 常在网页文本上优于 gzip,同时保持快速解码。
ZIP 容器: ZIP 是一种文件归档格式,可存储使用多种压缩算法(deflate、store、zstd 等)的条目。事实标准是 PKWARE 的 APPNOTE(参见APPNOTE 门户、托管副本以及美国国会图书馆的概览ZIP File Format (PKWARE)/ZIP 6.3.3)。
文件压缩是一种减小文件或文件集大小的过程,通常用于节省存储空间或加速网络传输。
文件压缩通过识别和删除数据中的冗余来工作。它使用算法在更小的空间中编码原始数据。
文件压缩的两种主要类型是无损压缩和有损压缩。无损压缩允许完美恢复原始文件,而有损压缩则以损失部分数据质量为代价,实现更大的大小减小。
文件压缩工具的一个流行例子是WinZip,它支持包括ZIP和RAR在内的多种压缩格式。
对于无损压缩,质量保持不变。然而,对于有损压缩,由于它消除了较不重要的数据以更大程度地减小文件大小,因此可能会有明显的质量下降。
是的,就数据完整性而言,文件压缩是安全的,尤其是无损压缩。然而,像任何文件一样,压缩的文件可能会被恶意软件或病毒攻击,因此总是必要的有安装可靠的安全软件。
几乎所有类型的文件都可以被压缩,包括文本文件、图像、音频、视频和软件文件。然而,可达到的压缩水平可以在文件类型之间大大变化。
ZIP文件是一种使用无损压缩来减小一个或多个文件大小的文件格式。ZIP文件中的多个文件有效地被捆绑在一起成为一个单一的文件,这也使得分享变得更容易。
技术上,是的,尽管额外的减小大小可能是微不足道的甚至适得其反。压缩一个已经压缩的文件有时可能会增加它的大小,由于压缩算法添加的元数据。
要解压文件,你通常需要一个解压或解压缩工具,如WinZip或7-Zip。这些工具可以从压缩格式提取原始文件。