一个归档是一个字节序列,分为以下几块:
- 第一个块是索引块,它描述了存档中其他块的位置。
- 索引中列出的所有块必须按索引中列出的顺序出现在归档中(按类型排序)
- 归档中可能包含索引中未引用的其他块,但这些块必须在索引中列出所有块之后出现在存档中。
例如,内容块在索引中列出。但是,该内容块可以从目录块中获得。 - 块不能重叠。
- 所有块都在 64 bit 边界上对齐。
- 所有块必须根据他们的对齐约束尽可能地紧密打包。
- 块之间的任何间隙必须用’0’填充。
所有偏移和长度在小字节序中被编码为无符号整数。
序列块
索引块是必需的,且必须从归档的开头开始。
- 8字节的魔法。
-必须是 0xc8 0xbf 0x0b 0x48 0xad 0xab 0xc5 0x11。 - 64位长度的多行索引条目,以字节为单位。
- 多行索引。
没有具有相同类型的两个索引项,且索引项必须按照 八位组字典增序
排列(例如,比较 memcmp )。索引中列出的块必须按照列出的顺序存储在归档中。
索引项
- 64 bit 块类型。
- 从归档的开始到引用块的开始,以 64 bit 字节为单位偏移。
- 64 字节长度的引用块。
哈希块 (type 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00)
哈希块是可选的。
- 32位哈希算法标识符
- 必须是1。
- 标识 "SHA-256"。
- 哈希数据
- 32位哈希长度。
- 必须是32。
- Octets的哈希。
- 从归档开始到索引末尾列出的最后一个块,用"octets of hash"替换为零的内容。
- Note:哈希包含索引中的所有块,但不包含任何不在索引中的内容块。如果需要检查内容块的完整性,请加上目录哈希块。
- 32位哈希长度。
Note:我们可能会将此哈希算法替换为我们在blobfs中使用的哈希算法。
目录块(类型 "DIR —–")
目录块是必需的。目录块中的条目必须具有唯一的名称,且必须将名称以"increasing lexicographical octet"对条目进行排序(例如,与memcmp类比)。
- Concatenated directory table entries.
这些条目表示归档中包含的文件。目录本身未明确表示,这意味着归档不能表示空目录。
目录表
- 名称
- 从目录名块开始到路径数据的32位偏移量,以字节为单位。
- 16位长度的名称,以字节为单位。
- 16位零,保留供将来使用。
- 数据
- 从归档开始到内容块开始的64位偏移量,以字节为单位。
- 64位长度的数据,以字节为单位。
- 64位零,保留供将来使用。
目录散列块(类型 "DIRHASH-")
目录哈希块是可选的。
- 32位 hash 算法标识符
- 必须是1。
- 标识 "SHA-256"。
- 每个Hash长度为32位。
- 必须是32。
- Concatenated octets of hashes
- 每个条目是目录表中与相应条目关联的内容块中的数据散列。
目录名称块
目录名称块是必需的,并且由目录块用来命名内容块。 路径数据必须按照"increasing lexicographical octet"排序 (比如, 类比memcmp)。
- Concatenated path data (未指定编码)。
- 零填充到下一个8字节边界。
Note: 用于索引路径数据的偏移量长度为32位,这意味着没有理由创建大于4 GB的目录名称块。
虽然未指定编码,但希望使用unicode显示路径数据的客户端可能会尝试将数据解码为UTF-8。而路径数据不一定是UTF-8,这意味着解码可能会失败。
路径数据-Path data
- Octets of path。
- 不能为空。
- 不得包含0x00八位字节。
- leading octet不能是 0x2F(’/’)。
- trailing octet不能是 0x2F (‘/’)。
- segments 是在0x2F(’/’)上拆分路径的结果。每segment必须遵循以下要求:
- 不能为空。
- 不能是 0x2E (‘.’)。
- 不能是 0x2E 0x2E (‘..’)。
内容块-Content chunk
内容块必须在索引块之后。内容块必须按照目录中列出的顺序出现在归档文件中。
- data
data必须在存档开始的4096字节边界上对齐,data必须用零填充,直到下一个4096字节边界。
Comments