PAX(预分配扩展)是一种开放源代码压缩存档格式,由 Microsoft 开发,作为 ZIP、RAR 和 tar 等现有格式的现代替代品。它旨在解决限制并改进现代系统和设备上存档处理的压缩、性 能、安全性和功能。
PAX 格式的关键区别特征包括使用现代算法增强压缩、高效随机访问存档中的文件、本机多线程支持、可扩展元数据、内置加密和完整性检查,以及鼓励广泛采用和互操作性的记录开放规范。
PAX 存档使用文件扩展名 .pax,并具有由头、中央目录、压缩数据块和页脚组成的多部分内部结构。这允许将存档内容、压缩参数和完整性哈希等关键信息与实际压缩文件数据分开存储。
PAX 头以 4 字节魔术数字(十六进制中的 50 41 58 00)开头,用于标识。然后它包含 PAX 版本、压缩方法、加密方法、哈希方法、块大小、并行压缩线程数和各种标志的字段。头以可扩展 XML 元数据结束,提供有关存档的详细信息。
在头之后是 PAX 中央目录。其中包含存档中每个压缩文件/文件夹的条目,存储完整路径、属性、大小、块偏移量和哈希。将此放在一个位置可以有效地列出存档内容并随机访问各个文件,而无需扫描压缩数据。
PAX 存档的主体是一系列压缩数据块。每个块都有一个小头,指示未压缩和压缩的大小,然后是一块使用配置算法压缩的文件数据。块的默认大小为 1 MB,但可以在存档头中调整此大小。
如果指定了加密方法,则压缩数据块将被加密。PAX 支持 AES-256 等现代加密方案。存档密码用于派生一个密钥,该密钥独立加密每个块,从而实现高效的随机访问。为了进行身份验证,PAX 使用安全的 KDF 对密码进行哈希处理。
对于压缩,PAX 支持各种针对快速解压缩进行优化的现代通用编解码器:LZMA、LZ4、Brotli、Zstandard 等。它还允许对特定文件类型进行预处理以进一步减小大小(例如,对 EXE/DLL 进行 Delta 编码,对 x86 代码进行 E8E9 编码)。编解码器和预处理器在管道中应用。
为了实现高效的 多线程压缩,文件被分区为独立压缩的块,这些块可以由并行编解码器实例处理。PAX 压缩器自动扩展以使用所有可用的 CPU 内核。类似的分区允许并行解压缩以实现更快的提取。
PAX 通过存储原始数据和压缩数据的哈希来提供数据完整性和篡改检测。存档带有头哈希以检测截断。中央目录也经过哈希处理,以防止篡改文件元数据。通过对每个块进行哈希处理来捕获压缩数据中的位腐烂。
在 PAX 存档的末尾是页脚。其中包含头字段的副本、中央目录的偏移量/大小以及整个存档的哈希。页脚大小固定,始终位于文件末尾,从而可以轻松定位和验证 PAX 存档。
与像 ZIP 一样重写整个存档相比,可以通过修改中央目录和附加更改的数据块来有效更新 PAX 存档。可以通过更新元数据并添加/删除相关块来插入、删除或替换整个文件。还可以快速追加存档。
为了减轻 zip-slip 漏洞,PAX 需要显式路径(没有 ../ 遍历)并防止在提取根目录之外写入。限制了启用拒绝服务的长 ZIP 元数据字段。通过限制压缩比和内存使用量来减轻压缩炸弹。
PAX 存档中的文件时间戳使用标准的 64 位格式,覆盖范围广泛的日期,精度为 1 秒。支持 POSIX 权限和 Windows ACL 的属性。PAX 可以存储 NTFS 备用数据流和资源分支。符号链接和硬链接也可以表示。
开源 PAX SDK 提供了简单的 API,用于以编程方式创建、提取、更新和验证 PAX 存档。它处理 PAX 格式的所有低级细节。SDK 以多种语言提供,包括 C、C++、C#、Java、Python、JavaScript、Go 和 Rust。
总之,PAX 存档格式建立在 ZIP 等经过验证的格式的基础上,同时引入了现代功能和优化 - 高效压缩、多线程、随机访问、安全性和开放规范。这使得 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。这些工具可以从压缩格式提取原始文件。