ar(归档器)格式是一种文件格式,用于创建和操作归档文件,该文件将多个文件存储在一个文件中。它起源于 Unix 系统,通常用于基于 BSD 的操作系统。ar 格式是一种简单有效的方法,可将多个文件打包在一起以进行存储或分发。
ar 归档文件由一个全局头后跟一系列归档成员组成。每个归档成员代表已存储在归档中的文件。全局头是一个简单的文本头,它将文件标识为 ar 归档,并提供有关归档格式版本的基本信息。
ar 归档的全局头以签名字符串“!<arch>\n”开头。该签名后跟一个换行符,用于将文件标识为 ar 归档。然后,签名后跟一系列文件成员,每个成员代表存储在归档中的文件。
ar 归档中的每个文件成员都包含一个文件头和文件数据本身。文件头包含有关文件元数据,例如其名称、修改时间戳、所有者和组 ID、文件模式和大小。文件头具有 60 字节的固定大小,其结构如下:
- 文件名(16 字节):表示文件名的一个以 null 结尾的字符串。如果文件名长于 15 个字符,则将其截断,并使用特殊符号“/”表示完整文件名存储在单独的文件成员中。
- 文件修 改时间戳(12 字节):表示自 1970 年 1 月 1 日(Unix 纪元时间)以来文件修改时间戳的十进制整数(以秒为单位)。
- 所有者 ID(6 字节):表示文件所有者用户 ID 的十进制整数。
- 组 ID(6 字节):表示文件组的组 ID 的十进制整数。
- 文件模式(8 字节):表示文件模式和权限的八进制整数。
- 文件大小(10 字节):表示文件大小(以字节为单位)的十进制整数。
- 结束字符(2 字节):两个特殊字符“`\n`”(反引号后跟换行符),表示文件头的结尾。
在文件头之后,存储文件数据本身。文件数据的大小由头中指定的文件大小决定。如果文件大小为奇数,则添加一个额外的填充字节以确保下一个文件成员的正确对齐。
ar 归档中的一个特殊文件成员是符号表,其名称为“/”。符号表用于存储超过文件头中 15 个字符限制的长文件名。当文件名太长时,它将在文件头中被截断,并且完整名称将存储在符号表中。符号表是一个特殊的文件成员,其中包含一个表示长文件名的以 null 结尾的字符串列表。
另一个特殊的文件成员是长文件名成员,其名称为“/[0-9]+”。此文件成员与符号表结合使用。当文件名太长而无法放入文件头时,将在符号表中创建一个特殊条目,格式为“/[offset]/[length]”,其中“offset”是长文件名成员中存储完整文件名的字节偏移量,“length”是完整文件名的长度。
ar 格式还支持在创建或操作归档文件时可使用的各种选项和标志。一些常见选项包括: - “r”:将文件插入现有归档中,用具有相同名称的任何现有文件替换它们。 - “c”:创建一个新的归档文件,覆盖具有相同名称的任何现有文件。 - “u”:更新现有归档中的文件,添加新文件或替换文件的旧版本。 - “d” :从现有归档中删除文件。 - “t”:列出归档的内容。
ar 格式的一个限制是它不支持压缩。存储在 ar 归档中的文件未压缩,并以其原始格式存储。但是,ar 归档可以与 gzip 或 bzip2 等压缩实用程序结合使用以创建压缩归档。
尽管 ar 格式很简单,但它已广泛使用了几十年,并且仍然是用于在 Unix 和 BSD 系统上创建和分发库文件的标准格式。许多常见的 Unix 实用程序,例如“ar”命令本身、“ranlib”命令(用于生成符号表)和“nm”命令(用于列出对象文件中的符号),都适用于 ar 归档。
总之,ar(归档器)格式是一种简单有效的文件格式,用于在 Unix 和 BSD 系统上创建和操作归档文件。它由一个标识归档的全局头组成,后跟一系列表示存储在归档中的文件的归档成员。ar 格式通过使用符号表和特殊文件成员支持长文件名。虽然它不提供内置压缩,但 ar 归档可以与压缩实用程序结合使用以创建压缩归档。ar 格式已广泛使用了几十年,并且仍然是用于在 Unix 和 BSD 系统上打包和分发文件的标准格式。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 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。这些工具可以从压缩格式提取原始文件。