Fuchsia 归档格式 (FAR)

概览

Fuchsia 归档格式是一种用于在文件中存储目录树的格式。与 .tar 或 .zip 文件一样,Fuchsia 归档文件存储从路径名称到文件内容的映射。

Fuchsia 归档文件有时称为 FAR 或 FAR 归档,其文件扩展名为 .far。

如需了解如何创建和构建 Fuchsia 软件包、检查软件包内容等,请参阅使用 Fuchsia 软件包进行开发。

格式

归档是一个字节序列,分为多个块:

  • 第一个块是索引块,用于描述其他块在归档中的位置。
  • 索引中列出的所有块都必须按照索引中列出的顺序(按类型排序)显示在归档中。
  • 归档可能包含索引中未引用的其他块,但这些块必须在索引中列出的所有块之后出现在归档中。例如,内容块未在索引中列出。而是可以通过目录块访问内容块。
  • 这些分块不得重叠。
  • 所有区块均在 64 位边界上对齐。
  • 所有块都必须尽可能紧密地打包,并受其对齐限制条件的约束。
  • 分块之间的任何间隙都必须用零填充。

所有偏移量和长度均编码为小端字节序的无符号整数。

索引块

索引块是必需的,并且必须从归档的开头开始。

  • 8 字节的幻数。
    • 必须为 0xc8 0xbf 0x0b 0x48 0xad 0xab 0xc5 0x11。
  • 串联索引条目的 64 位长度(以字节为单位)。
  • 串联的索引条目。

任何两个索引条目都不能具有相同的类型,并且条目必须按类型以升序字典八位字节顺序(例如,通过 memcmp 进行比较)进行排序。索引中列出的区块必须按照索引中列出的顺序存储在归档中。

索引条目

  • 64 位块类型。
  • 从归档开头到所引用块开头的 64 位偏移量(以字节为单位)。
  • 所引用数据块的 64 位长度(以字节为单位)。

目录块(类型“DIR-----”)

必须提供目录分块。目录块中的条目必须具有唯一的名称,并且条目必须按名称以递增的字典顺序排序(例如,通过 memcmp 进行比较)。

  • 串联的目录表条目。

这些条目表示归档文件中包含的文件。目录本身不会明确表示,这意味着归档无法表示空目录。

目录表条目

  • 名称。
    • 从目录名称块开头到路径数据的 32 位偏移量(以字节为单位)。
    • 名称的 16 位长度(以字节为单位)。
  • 16 位零,预留以供日后使用。
  • 数据。
    • 从归档开头到内容块开头的 64 位偏移量(以字节为单位)。
    • 数据的 64 位长度(以字节为单位)。
  • 64 位零,预留以供日后使用。

目录名称块(类型为“DIRNAMES”)

目录名称块是必需的,目录块会使用它来命名内容块。路径数据必须按字典顺序以升序进行排序(例如,通过 memcmp 进行比较)。

  • 串联的路径数据(未指定编码)。
  • 零填充到下一个 8 字节边界。

虽然未指定编码,但希望使用 Unicode 显示路径数据的客户端可能会尝试将数据解码为 UTF-8。路径数据可能是 UTF-8,也可能不是,这意味着解码可能会失败。

路径数据

  • 路径的八位字节。
    • 值不能为空。
    • 不得包含 0x00 八位字节。
    • 前导八位字节不得为 0x2F(“/”)。
    • 尾随八位字节不得为 0x2F(“/”)。
    • 假设段是在 0x2F ('/') 处拆分路径的结果。每个段都必须满足以下要求:
      • 值不能为空。
      • 不得恰好为 0x2E ('.')
      • 不得恰好为 0x2E 0x2E ('..')

内容块

内容块必须位于索引块中列出的所有块之后。内容块必须按照其在目录中列出的顺序显示在归档中。

  • 数据

数据必须从归档开头对齐到 4096 字节边界,并且必须用零填充,直到下一个 4096 字节边界。