ZIP 文件格式是一种广泛使用的压缩和归档格式,它允许将多个文件打包到一个压缩文件中。它最初由 Phil Katz 于 1989 年创建,此后已成为文件压缩和分发的普遍标准。ZIP 格式使用无损压缩算法的组 合来减小所包含文件的大小,同时仍允许根据需要单独提取它们。
ZIP 存档由一系列文件记录组成,每个记录代表一个压缩文件,后面是存档末尾的中心目录。每个文件记录都包含有关文件元数据,例如其名称、大小和时间戳,以及压缩文件数据本身。中心目录包含存档中所有文件记录的列表,以及其他元数据。
ZIP 格式支持多种压缩方法,但最常用的方法是 DEFLATE,它基于 LZ77 算法和霍夫曼编码。DEFLATE 通过查找重复的数据序列并用对早期出现的引用的替换它们来工作,结合霍夫曼编码来有效地表示压缩数据。这可以显着减小大小,特别是对于基于文本的文件。
要创建 ZIP 存档,首先使用所选压缩方法单独压缩文件。然后将每个压缩文件作为文件记录添加到存档中,其中包括本地文件头后跟压缩数据。本地文件头包含元数据,例如文件名、压缩方法、CRC-32 校验和、压缩和未压缩大小以及时间戳。
在添加所有文件记录后,中心目录将写入存档的末尾。中心目录以签名开头,并包含每个文件记录的文件头,其中包含类似于本地文件头的元数据。此外,中心目录还包括有关整个存档的信息,例如文件数和中心目录的大小。
最后,ZIP 存档以中心目录结束记录,其中包括签名、中心目录开始的磁盘数、中心目录记录数、中心目录大小、中心目录开始相对于存档开始的偏移量和注释字段。
ZIP 格式的一个关键特性是它支持各种压缩方法。除了 DEFLATE 之外,它还支持 STORE 方法(无压缩)、BZIP2、LZMA、PPMd 等。这种灵活性允许在压缩比和处理时间之间取得平衡,具体取决于用例的特定要求。
ZIP 格式的另一个重要方面是它支持文件和目录加密。传统的 ZIP 加密方案使用简单的基于密码的加密方法,但它在现代 ZIP 工具中已被更安全的 AES 加密所取代。当文件被加密时,其压缩数据使用所选加密方法进行加密,并向文件头添加其他元数据以指示加密状态。
ZIP 格式还包括用于数据完整性检查和错误检测的功能。每个文件记录都包含未压缩数据的 CRC-32 校验和,这允许在提取时验证文件的完整性。此外,中心目录还包含整个中心目录结构的 CRC-32 校验和,为整个存档提供额外的完整性检查层。
多年来,ZIP 格式已经进行了多项扩展和增强,以提高其功能和效率。其中一个扩展是 ZIP64 格式,它允许存档和文件大于 4 GB。这是通过对大小和偏移值使用 64 位字段来实现的,而不是原来的 32 位字段。另一个扩展是使用文件名和注释编码,它允许在文件名和注释中使用 Unicode 字符。
ZIP 格式也已适应在各种专门的上下文中使用,例如办公生产力套件使用的 OpenDocument 格式、用于分发 Java 应用程序的 JAR(Java 存档)格式以及用于电子书的 EPUB 格式。在这些情况下,ZIP 格式充当特定文件类型和各自格式所需的元数据的容器。
尽管 ZIP 格式已经很老了,但它仍然在各个平台和设备上得到广泛使用和支持。它的简单性、效率和兼容性使其成为文件压缩和分发的首选。但是,ZIP 格式也有一些限制,例如它缺乏对拆分存档、固态压缩或恢复记录的内置支持。
为了解决其中一些限制,已经开发了替代的归档格式,例如 RAR、7z 和 TAR。在某些情况下,这些格式提供了附加功能和改进的压缩比,但它们可能没有与 ZIP 相同级别的通用支持。
总之,ZIP 文件格式是一种通用且高效的压缩和归档格式,经受住了时间的考验。它将多个文件打包在一起、有效压缩它们并提供数据完整性检查的能力使其成为文件存储和分发的基本工具。尽管存在一些 限制,但 ZIP 格式仍然被广泛使用和支持,这要归功于它的简单性和兼容性。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 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。这些工具可以从压缩格式提取原始文件。