原始载荷格式
原始载荷是压缩与混淆之前的二进制数据,根据 Flat 和 ExtInfo 标志位分为三种模式。
目录树模式(Flat = 0)
保留完整目录结构,通过 JSON 元数据描述文件树。
┌──────────────────────────────────────┐
│ JSON 长度 (4 bytes, uint32 LE) │
├──────────────────────────────────────┤
│ JSON 文本 (UTF-8, 无 BOM) │
│ { │
│ "v": 1, │
│ "m": { /* manifest */ }, │
│ "t": { /* 文件树 */ } │
│ } │
├──────────────────────────────────────┤
│ 文件块 (所有文件原始字节依次拼接) │
├──────────────────────────────────────┤
│ (可选) 自定义数据段 │
└──────────────────────────────────────┘JSON 结构
顶层字段:
v— 载荷版本,当前为1m— manifest 对象(从源目录manifest.json读取,透传)t— 文件树,根节点为对象,每个键对应一个条目:
json
{
"subdir": {
"c": {
"file.txt": { "o": "0", "s": "1024" },
"image.png": { "o": "1024", "s": "65536" }
}
},
"readme.md": { "o": "67584", "s": "2048" }
}- 目录节点:包含
"c"(children),值为子条目对象 - 文件节点:包含
"o"(offset)和"s"(size),均以 字符串 表示,避免 JavaScript 浮点数精度丢失 - offset 从文件块起始处计算
扁平模式 – 标准(Flat = 1, ExtInfo = 0)
所有文件必须位于根目录,无子文件夹。
┌──────────────────────────────────────┐
│ 文件数量 (2 bytes, uint16 LE) │
├──────────────────────────────────────┤
│ 文件条目 1: │
│ - 文件名长度 (2 bytes, uint16 LE) │
│ - 文件名 (UTF-8) │
│ - 内容长度 (4 bytes, uint32 LE) │
│ - 内容 (原始字节) │
├──────────────────────────────────────┤
│ 文件条目 2: │
│ ... │
├──────────────────────────────────────┤
│ Manifest 长度 (4 bytes, uint32 LE) │
├──────────────────────────────────────┤
│ Manifest 文本 (UTF-8 JSON) │
├──────────────────────────────────────┤
│ (可选) 自定义数据段 │
└──────────────────────────────────────┘限制:文件数 ≤ 65535,单文件大小 < 4 GiB。
扁平模式 – 扩展(Flat = 1, ExtInfo = 1)
支持超过 65535 个文件或单文件 ≥ 4 GiB。
┌──────────────────────────────────────┐
│ 文件数量 (8 bytes, uint64 LE) │
├──────────────────────────────────────┤
│ 文件条目 1: │
│ - 文件名长度 (2 bytes, uint16 LE) │
│ - 文件名 (UTF-8) │
│ - 基本内容长度 (4 bytes, uint32 LE)│
│ - (如果基本长度 == 0xFFFFFFFF) │
│ 扩展内容长度 (8 bytes, uint64 LE) │
│ - 内容 (原始字节) │
├──────────────────────────────────────┤
│ ... │
├──────────────────────────────────────┤
│ Manifest 长度 (4 bytes, uint32 LE) │
├──────────────────────────────────────┤
│ Manifest 文本 (UTF-8 JSON) │
├──────────────────────────────────────┤
│ (可选) 自定义数据段 │
└──────────────────────────────────────┘长度扩展规则(ZIP64 式)
- 基本内容长度字段(4 bytes)始终存在
- 若该值 ≠
0xFFFFFFFF,则为真实文件大小 - 若该值 =
0xFFFFFFFF,则紧跟 8 bytes uint64 作为真实大小
