PAX(打包存档格式)是一种用于存档和压缩文件和目录的文件格式。它最初由 Google 开发,基于 ZIP 和 tar 格式技术的组合。PAX 旨在提供高效的压缩、对文件的快速随机访问以及对自定义元数据的可扩展性。
在核心部分,PAX 存档包含一个中心目录,其中包含已存档文件的元数据,然后是压缩的文件数据本身。中心目录始终位于存档的末尾,以便快速访问,而无需扫描整个文件。
中心目录中的每个文件条目都包含文件路径、大小、时间戳、CRC32 校验和和所用压缩方法等信息。文件路径存储为 Unicode 字符串,从而支持非 ASCII 文件名。PAX 对文件路径使用 UTF-8 编码。
对于压缩,PAX 支持多种算法,包括 DEFLATE、Brotli 和 Zstandard (zstd)。DEFLATE 是默认方法,它与 ZIP 和 gzip 中使用的算法相同。它在压缩比和速度之间提供了良好的平衡。Brotli 和 Zstandard 是较新的算法,可以提供更好的压缩比,特别是对于某些类型的数据(如文本文件),但代价是压缩和解压缩速度较慢。
PAX 中的压缩文件数据存储在块中,每个块的最大未压缩大小为 1 MB。这种分块存储支持对 文件的有效随机访问,因为只需要找到并解压缩必要的块即可提取特定文件,而不是处理整个存档。
PAX 的一个关键特性是对固态压缩的支持。使用固态压缩,存档被视为一个连续的数据流,而不是一个单独文件的集合。这允许压缩器跨文件边界查找冗余和模式,从而可能导致更高的压缩比。但是,固态压缩会影响快速访问各个文件的能力,因为可能需要解压缩到所需文件的整个存档。
PAX 还包括完整性检查以检测数据损坏。中心目录中的每个文件条目都包含未压缩文件数据的 CRC32 校验和。在提取文件时,PAX 会计算解压缩数据的校验和,并将其与存储的校验和进行比较以验证完整性。此外,PAX 存档可以包含可选的数字签名以提供身份验证和篡改检测。
为了提高性能,PAX 支持多线程压缩和解压缩。文件可以并行压缩并写入存档,利用多个 CPU 内核。同样,在提取过程中,可以同时解压缩多个文件。这种并行处理可以在多核系统上显著加快存档和提取操作。
PAX 存档还可以存储超出标准文件属性的附加元数据。可以使用键值对将自定义元数据分配给文件和目录。此元数据与文件条目一起存储在中心目录中。自定义元数据的示例包括作者信息、文件类别或特定于应用程序的数据。
流支持是 PAX 的另一个特性。可以在流方式下创建和提取存档,而无需将整个存档加载到内存中。当处理大型存档或使用有限的内存资源时,这特别有用。流允许在运行时创建存档或在通过网络连接接收数据时处理存档。
为了向后兼容和互操作性,PAX 存档可以包含一个后备 ZIP 存档。ZIP 存档附加到 PAX 存档的末尾,并以传统的 ZIP 格式包含相同的文件。这允许不支持 PAX 的较旧工具仍然从存档的 ZIP 部分提取文件。
PAX 因其效 率、灵活性以及开源实现而广受欢迎。它受到不同平台上各种存档工具和库的支持。称为 libpax 的参考实现是用 C 编写的,它提供了一个用于创建和提取 PAX 存档的低级 API。
PAX 的一个限制是它本机不支持加密。但是,可以通过将 PAX 与其他加密技术相结合或使用基于 PAX 格式构建的第三方工具来实现加密。
总之,PAX(打包存档格式)是一种通用且高效的文件存档格式,提供快速随机访问、固态压缩、并行处理、自定义元数据和流支持等特性。其压缩算法、分块存储和可扩展性的组合使其成为存档和分发文件的引人注目的选择。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 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。这些工具可以从压缩格式提取原始文件。