磁盘格式 · 权威可视化参考
RAR5 / RAR7 格式参考
以 rar-rs 实现为唯一权威(对照 WinRAR 7.23 逐字节互操作验证)。 与 bitplane/rars 及其 rar-research 规格书冲突处,以本实现为准。 所有 vint 为 RAR5 变长整数(§2.2);多字节整数一律小端。
1 · 心智模型:块流总览
RAR5/RAR7 是一个块流(block stream)格式:一个归档 = 一串首尾相接、无间隙的块。五种块共用同一个外层信封(§2/§4)。
自解压模块。起点 = 首个 Rar!\x1a\x07\x01\x00 签名(detect::sfx_offset_of)。
Rar! 后接 1A 07 01 00。RAR7 同此签名。
明文写(无 IV)。-hp 分卷的每一卷开头重复此块。
含 VOLUME / SOLID / RECOVERY / LOCKED 标志;extra 区携带 QO/RR 偏移 locator。
成员 = 文件头 + 紧跟数据区。数据区是 LZSS+Huffman 流,或(method=0 STORE)原文。压缩成员后跟一组压缩块(§6)。
quick-open 缓存:每个文件头的副本,使 listing 为 O(QO) 而非 O(archive)。
GF(2¹⁶) Cauchy 奇偶(§9.1)。-hp / 分卷下不可用。
块标志写 0x0004;"有无下一卷"放在随后的结束标志 vint 里(见 §4.6 陷阱)。
单卷:上序。多卷:每卷末尾为带 END_FLAG_NEXT_VOLUME 的结束头;-hp 分卷每卷开头重复明文加密头。
2 · 基础编码
2.1 字节序
所有多字节整数(CRC、时间戳、偏移、大小)均为小端。
2.2 vint · 变长整数
每字节 7 数据位(bit 0–6),bit 7 续延(1=还有)。小端序,上限 10 字节;第 10 字节超出 bit 63 的位被忽略。
⚠ 非规范定宽 vint:WinRAR 7.x 写头部大小等字段用非最简定宽 vint,短值也可能占 9–10 字节。块头 CRC32 必须对磁盘原始 vint 字节 + body 算,而非重编码后的规范 vint;locator 偏移用 vint_fixed 预分配、close 时回填。
3 · 最小归档解剖(逐字节示例)
由 rar a -m0 tiny.rar tiny.txt 生成(STORE、单文件、单卷),共 111 字节。可对照 §2–§5 完整拆解。
主归档头 · block 0x01
| 偏移 | 字节 | 说明 |
|---|---|---|
| 0x00 | 52 61 72 21 1a 07 01 00 | 归档签名 Rar!\x1a\x07\x01\x00(8 字节) |
| 0x08 | c5 1a 33 32 | 头部 CRC32(LE)= 0x32331AC5,覆盖 [size vint 原字节] + body |
| 0x0c | 03 | 头部大小 vint = 3 |
| 0x0d | 01 | 块类型 = 0x01(归档头) |
| 0x0e | 00 | 块标志 = 0 |
| 0x0f | 00 | 归档标志 = 0(单卷 / 非 solid / 未锁定) |
文件头 · block 0x02
| 偏移 | 字节 | 说明 |
|---|---|---|
| 0x10 | 6c 11 bb d1 | 头部 CRC32(LE)= 0xD1BB116C |
| 0x14 | 48 | 头部大小 vint = 0x48 = 72 |
| 0x15 | 02 | 块类型 = 0x02(文件头) |
| 0x16 | 03 | 块标志 = 0x0001 | 0x0002 = EXTRA_DATA | DATA_AREA |
| 0x17 | 0b | 额外区大小 vint = 11 |
| 0x18 | 0a | 数据区大小 vint = 10(packed 大小) |
| 0x19 | 06 | 文件标志 = 0x0002 | 0x0004 = TIME_UNIX | CRC32 |
| 0x1a | 0a | 解压大小 vint = 10 |
| 0x1b | a4 83 02 | 属性 vint = 0o100644(Unix 普通文件) |
| 0x1e | 76 aa 92 6a | 4 字节 LE mtime = 0x6A92AA76 |
| 0x22 | 9d d2 80 b1 | 4 字节 LE CRC32(明文 hello rar\n) |
| 0x26 | 00 | 压缩信息 vint = 0 → v0(RAR5) · solid0 · method0(store) · dict0 |
| 0x27 | 01 | host OS = 1(Unix) |
| 0x28 | 29 | 名字长度 vint = 0x29 = 41 |
| 0x29…0x51 | 43 3a 2f … 74 78 74 | 名字 UTF-8 = C:/Users/.../tiny.txt(41 字节) |
额外区(11B)· 数据区(10B)· 结束头(block 0x05)
| 偏移 | 字节 | 说明 |
|---|---|---|
| 0x52 | 0a | 额外记录大小 vint = 10(含类型字节) |
| 0x53 | 03 | 额外记录类型 = 0x03(HTIME 文件时间) |
| 0x54 | 13 | HTIME 标志 = 0x01|0x02|0x10(unix|mtime|ns) |
| 0x55…0x58 | 76 aa 92 6a | 4 字节 LE mtime 秒 = 0x6A92AA76 |
| 0x59…0x5c | 58 6a b8 16 | 4 字节 LE mtime 纳秒 = 0x16B86A58(≈ 0.381 s) |
| 0x5d…0x66 | 68 65 6c 6c 6f 20 72 61 72 0a | 数据区:hello rar\n(STORE,原样) |
| 0x67 | 1d 77 56 51 | 结束头 CRC32(LE)= 0x5156771D |
| 0x6b | 03 | 头部大小 vint = 3 |
| 0x6c | 05 | 块类型 = 0x05(结束头) |
| 0x6d | 04 | 块标志 = 0x0004(SKIP_IF_UNKNOWN,⚠ 见 §4.6) |
| 0x6e | 00 | 结束标志 = 0(单卷,后面无分卷) |
💡 文件头里既有 4 字节头部 mtime(0x1e),额外区又有 HTIME 的 mtime(0x55)。两者值相同,但 HTIME 携带纳秒精度——解码时以 HTIME 的 mtime 为准。压缩成员(method≠0)的文件头后还跟一组压缩块(§6)。
4 · 各块详解
4.1 归档签名
52 61 72 21 1A 07 01 00 — "Rar!" 1A 07 01 00
RAR7 签名相同。RAR4 及更早(Rar!\x1a\x07\x00 / RE~^)由 rar-rs 独立读/解压;本文档只覆盖 RAR5/RAR7 容器,不描述它们的布局。
4.2 主归档头(0x01)
[块类型=0x01][块标志][extra 大小?][归档标志 vint][卷号 vint —— 仅当 VOLUME_NUM][extra 区]
归档标志
| 0x0001 | VOLUME | 分卷集一员 |
| 0x0002 | VOLUME_NUM | 后随卷号(1 起) |
| 0x0004 | SOLID | 固态归档 |
| 0x0008 | RECOVERY | 含内联 RR |
| 0x0010 | LOCKED | 已锁定 |
Locator 记录(extra type 0x01)
[记录大小 vint][类型=0x01][标志 vint: 0x0001 有 QO / 0x0002 有 RR][QO 偏移 vint][RR 偏移 vint]
偏移相对归档起点(签名之后),固定 5 字节 vint;在 close 时回填(QO/RR 记录起始绝对位置)。
🔧 rar-rs 做法:locator 的 QO/RR 偏移字段用 vint_fixed 预分配(宽度默认 5 字节,调用方给出预计大小时按官方分档 3/4/5/6),写文件时在对应绝对位置原地回填——偏移在写文件头时尚未知。读端用 main_header_locator_fields 定位这两个字段。
4.3 文件头(0x02)
[类型=0x02][块标志][extra 大小?][数据大小?][文件标志][解压大小][属性][mtime 4LE?][CRC32 4LE?][压缩信息][host OS][名字长度][名字 UTF-8][extra 区?]
文件标志
| 0x0001 | DIRECTORY | 目录条目(无数据区) |
| 0x0002 | TIME_UNIX | 4 字节 Unix mtime |
| 0x0004 | CRC32 | 4 字节 CRC32 |
| 0x0008 | UNKNOWN_SIZE | 解压大小未知(流式) |
压缩信息 vint · 位布局
| bit 0–5 | version | 0=RAR5 / 1=RAR7 |
| bit 6 | solid | 共享 LZ 窗口 |
| bit 7–9 | method | 0=store, 1–5=级别 |
| bit 10–14 | dict | RAR5 4 位幂(10–13)/ RAR7 5 位幂 |
| bit 15–19 | dict_frac | RAR7 1/32 增量 |
RAR5 字典 128 KiB << log(≤ 4 GiB);RAR7 字典 (32+frac) << (power+12)(≤ 126 GiB,见 §11.2)。
4.4 服务块(0x03)
复用文件头外形(type=0x03,名字在名字字段),数据区承载服务负载,extra 区承载 SUBDATA 记录(type 0x07)。rar-rs 支持四种:
| 名字 | 负载 | extra SUBDATA | 块标志 |
|---|---|---|---|
| CMT | 注释文本(数据区,store) | 无 | DATA_AREA |
| QO | quick-open 缓存 | 空记录(仅类型字节) | DATA_AREA + SKIP_IF_UNKNOWN |
| RR | 内联恢复奇偶数据 | 1 字节恢复百分比 | DATA_AREA + SKIP_IF_UNKNOWN |
| STM | NTFS 备用流内容 | 流名 :name | DATA_AREA + DEPENDS_PREV |
QO 负载:每条 [条目 CRC32 4LE][body 大小 vint][body = 条目标志 0][相对偏移 vint][头部大小 vint][文件头原字节];相对偏移 = QO 起始 − 文件头绝对位置(正值)。
4.5 归档加密头(0x04)
[类型=0x04][块标志=0][加密版本 vint=0][加密标志 vint: 0x0001 密码校验位][强度 1B][盐 16B][12B 密码校验值?]
归档级加密头不含 IV——其后每个块自带 16 字节 IV(§7.2)。-hp 分卷集的每一卷开头重复此明文块(同盐/同校验值)。该头之后所有块为 [16B IV][AES-256-CBC 密文](zero-fill,§7.2)。
4.6 归档结束头(0x05)
[类型=0x05][块标志=SKIP_IF_UNKNOWN 0x0004][结束标志 vint]
结束标志 0x0001 = NEXT_VOLUME;分卷非末卷写 NEXT_VOLUME,末卷写 0。
⚠ 7-Zip 陷阱(务必照做):0x0004 是真实的块标志位。若把"结束标志=1"误塞进块标志位,7-Zip 会把它当 EXTRA_DATA,进而把结束标志当 extra 区大小消费掉,多卷解析直接失败。WinRAR 写 SKIP_IF_UNKNOWN(0x0004),rar-rs 同样写这个块标志值,把"有无下一卷"放在随后的结束标志 vint 里。
5 · Extra 记录
共用信封:[记录大小 vint][记录类型 vint][记录体 …](记录大小 = 类型字节及之后所有字节数)
| 类型 | 名称 | 出现位置 |
|---|---|---|
| 0x01 | 文件加密参数 | 加密文件头 |
| 0x02 | 哈希(BLAKE2sp) | 文件头(-htb) |
| 0x03 | 文件时间(HTIME) | 文件头(-ts) |
| 0x04 | 文件版本 | 文件头(-ver[n]) |
| 0x05 | 重定向 | 链接/复制成员(无数据区) |
| 0x06 | owner/group | 文件头(-ow) |
| 0x07 | 服务数据 SUBDATA | 服务块(RR 百分比、STM 流名) |
5.1 文件加密(0x01)
[加密版本 0][加密标志: 0x0001 校验值 / 0x0002 hash-key MAC][强度 1B][盐 16B][IV 16B][12B 校验值?]
5.2 哈希(0x02)
[哈希类型 0(BLAKE2sp)][32 字节哈希值]
8 路并行 BLAKE2s 树哈希,输出 32 字节(-htb)。加密文件用 hash-key MAC 保护(§7.5)。
5.3 文件时间 HTIME(0x03)
[标志 vint][时间字段 …]
标志 0x0001 Unix 秒 / 0x0002 mtime / 0x0004 ctime / 0x0008 atime / 0x0010 纳秒。Unix 秒格式:先全部秒字段再全部纳秒字段。FILETIME 格式:8 字节 LE,100 ns 自 1601-01-01。💡 头部 mtime 被 HTIME 的 mtime 覆盖。
5.4 文件版本(0x04)
[版本号 vint]
5.5 重定向(0x05)
[重定向类型 vint][标志 vint][目标名字长度][目标名字 UTF-8]
0x01 Unix 符号链接 / 0x02 Windows 符号链接 / 0x03 junction / 0x04 硬链接 / 0x05 文件复制。无数据区;未知类型降级为空普通文件。
5.6 owner/group(0x06)
[标志: 0x0001 owner / 0x0002 group][owner?][group?]
5.7 SUBDATA(0x07)
服务块 extra 区。RR 1 字节恢复百分比;STM 流名 :name。
6 · 压缩数据流(LZSS + Huffman)
flowchart LR
A[输入字节] --> B[BT4 匹配查找]
B --> C[LZSS 符号流]
C --> D{过滤器}
D -->|Delta/E8/E8E9/ARM| E[解压输出区域]
E --> F[Huffman 表 ×4: BC/NC/DC/LDC/RC]
F --> G[压缩块帧: 标志/校验/大小]
G --> H[MSB 位流打包]
H --> I[packed 输出]
classDef core fill:#0f172a,stroke:#1e293b,color:#fff;
class I core;
6.1 压缩块头
[标志 1][校验 1][大小 1–3 LE][块数据]
标志 bit 7=含 Huffman 表;bit 6=末块;bit 5–3=大小字段宽度−1;bit 2–0=末字节有效位−1。校验 = 0x5A ^ 标志 ^ 大小每字节。空成员:单块 0x40。主压缩路径把 LZSS 流切成发射块合并到 ≤ 4 MiB,每块独立 Huffman 表;符号流在 ~64 KiB 子跨度间局部字面量/距离/长度分布漂移时提前闭合(重复文本整成员一块,异构二进制保持 ~64 KiB 小块,对齐 WinRAR)。解析侧分块预算上限仍 128 KiB(MAX_BLOCK_SIZE);滤波器编码路径与普通路径共用同一发射块策略(EMITTED_BLOCK_SIZE + find_block_end_adaptive,parse.rs 单一 owner)。
6.2 Huffman 表
每块先写 4 张表,码长 ≤ 15
| BC | 20 | 编码其余表的码长 |
| NC | 306 | 主符号 |
| DC | 64 / 80(DCX) | 距离低位 |
| LDC | 16 | 大距离低 4 位 |
| RC | 44 | 过滤器参数 |
码长串联经 BC 表 RLE(16/17/18/19 带额外位);BC 码长用 4 位半字节,15 转义零游程。解码用 quick-lookup(2¹⁰)。
6.3 LZSS 主符号(NC 表)
| 0–255 | 字面量字节 |
| 256 | 过滤器标记(§6.6) |
| 257 | 重复匹配(距离缓存 0 号 + 上一匹配长度) |
| 258–261 | 距离缓存索引 0–3 的匹配(长度见后) |
| 262–305 | 匹配,长度槽 = 符号 − 262(§6.4) |
6.4 长度解码
slot < 8: 长度 = 2 + slot
slot ≥ 8: lbits = slot/4 − 1
base = 2 + ((4 | (slot & 3)) << lbits)
长度 = base + 读 lbits 位
6.5 距离解码与缓存
slot < 4: 距离 = 1 + slot
slot ≥ 4: dbits = slot/2 − 1
base = 1 + ((2 | (slot & 1)) << dbits)
dbits ≥ 4: 高 (dbits−4) 位直接读,低 4 位用 LDC
dbits < 4: 直接读 dbits 位
距离 = base + 上述增量
距离缓存:4 项 LRU。NC 257 与 NC 258–261 读缓存提至队首;新距离压队首。长度奖励:距离 > 0x100 / 0x2000 / 0x40000 各 +1。
6.6 过滤器
[块起始偏移 vint][块长度 vint][过滤器类型 3 位][通道数−1 5 位]
类型 0 Delta / 1 E8 / 2 E8E9 / 3 ARM(仅 Delta 用通道数 1–4)。作用于解压输出区域,可链式;区域上限 0x3FFFF(256 KiB − 1)。类型 4–7 显式报错。
6.7 位序
压缩位流高位在前(MSB-first)逐字节打包;Huffman 码与额外位同序。
7 · 加密
flowchart TD
P[password] --> KDF
S[salt 16B] --> KDF
KDF["HMAC-SHA256 单链 · 2^strength 次"] --> S1["切点 2^s: AES-256 数据/头密钥 32B"]
KDF --> S2["切点 +16: hash key 32B"]
KDF --> S3["切点 +32: 密码校验值 8B"]
S1 --> ENC["AES-256-CBC · zero-fill 填充"]
S2 --> MAC["hash-key MAC 保护明文 CRC/哈希"]
S3 --> PV["12B 校验值 · 常数时间比较"]
classDef core fill:#0f172a,stroke:#1e293b,color:#fff;
class ENC,MAC core;
7.1 密钥派生(链式 HMAC-SHA256 KDF)
U₀ = HMAC(password, salt‖BE32(1)); Uᵢ = HMAC(password, Uᵢ₋₁); acc = XOR 累积
单条 HMAC 链共 2^strength + 32 次迭代,XOR 折叠在三个切点取样(数据密钥 / hash key / 校验值)。💡 强度上限 2²⁴(读取侧拒绝防 CPU DoS);默认 2¹⁵。三段产物来自同一条链。
7.2 文件加密
AES-256-CBC,每文件随机 IV。填充 zero-fill 到 16 字节边界(非 PKCS7,7-Zip 校验全零);空文件也产生 16 字节密文。流式:IV 链跨分块连续(CbcRangeEmitter),卷大小仍精确。加密成员头 CRC 是密文 CRC;明文 CRC 用 hash-key MAC 保护。
7.3 密码校验值(12 字节)
[0..8) KDF 末段 XOR 折叠 8 字节 · [8..12) SHA-256(前 8 字节)[0..4)
比较为常数时间。无校验值时(flags 无 0x0001)任何密码都"通过"。
7.4 头加密(-hp)
每卷开头写明文归档加密头(无 IV);其后每块头为 [16B 随机 IV][AES-256-CBC(zero-fill) 密文]。密钥每卷重派(同盐),块 IV 各自随机。🔧 限制(与 WinRAR 一致):-hp 分卷不能用内联 RR;QO 不与 -hp/分卷组合。
7.5 hash-key MAC
MAC(CRC32) = XOR 折叠 HMAC(hash_key, CRC32_LE) 的 8 个 4 字节块
MAC(hash32) = 同上逐 4 字节折叠成 32 字节
加密 extra 记录标志 0x0002 表示使用。解密端先还原明文 CRC/哈希再校验。
8 · 多卷归档
命名 name.partN.rar(N 从 1);discover_volumes 自动发现全卷。
跨卷成员:旧卷写 DATA_CONTINUES 块(非末块头带密文 CRC32),新卷写 DATA_CONTINUE_TO 块(末块头带 MAC 明文 CRC + 完整 extra 区)。支持创建/读取/删除/重命名跨卷成员;不支持分卷 append、分卷锁定、分卷注释、分卷内联 RR(官方 rar 同样拒绝)。恢复卷见 §9.2。
9 · 恢复记录
9.1 内联 RR · {RB} 块固定头 0x48 + 状态表 + 奇偶
规划:受保护前缀 ≥ 200 KiB 时 data_shards = 200;否则 ceil(prefix/1 KiB)。recovery_shards = 2·pct·data_shards/200(≥1, ≤data_shards)。group_count = 2×ceil(prefix/(2·data_shards))(偶数)。修复:找损坏分片(CRC64 状态不符),在 GF 上解缺失字节;无损坏原样返回。
9.1 GF(2¹⁶) Cauchy
本原多项式 0x1100b,域大小 65535。
M[i][j] = inv((i + data_shards) ^ j)
奇偶字节 = 分片字节(16 位符号)按矩阵行线性组合(XOR + 域乘)。修复 = 从幸存分片 + 奇偶解线性方程(含矩阵求逆;奇异报错)。
9.2 恢复卷(.rev, REV5) Rar!\x1aRev 为分卷集提供 Reed-Solomon 奇偶卷,可重建缺失卷(rar rc)。数量 NR = max(1, ceil(pct×ND/100))(≤ ND)。奇偶按同一 GF(2¹⁶) Cauchy,切分补齐到最大卷大小。
10 · Solid 固态归档
- · 主头带 SOLID 标志;文件头压缩信息带 solid 位。
- · 编码器状态(EncoderState)跨成员保持:lookbehind 窗口尾部、距离缓存、last-length、Huffman 表——连续压缩成员共享一个 LZ 窗口。
- · 解码器状态(DecoderState)同理跨成员保持。
- · 目录 / STORE / 空文件不参与 LZ 窗口(写端重置链)。
- · solid 分卷同样支持(状态跨卷保持)。
🔧 rar-rs:solid 与多线程压缩互斥(solid 保持串行);WinRAR 无 rarfiles.lst 时按名字/扩展名启发式排序,rar-rs 按参数顺序(已知小差异,互操作无碍)。
11 · RAR7(v70)
共享
- · 签名 Rar!\x1a\x07\x01\x00
- · 块信封 / 五种块
- · 加密 / 恢复体系
v50 · RAR5
version=0;DC 64 码;字典 128 KiB << log(≤ 4 GiB)。
v70 · RAR7
version=1;DCX 80 码;字典 (32+frac)<<(power+12)(非 2 的幂,≤ 126 GiB)。
> 4 GiB 字典请求自动选 v70;裁剪落回 ≤ 4 GiB 时自动降级 v50。RAR7 不是独立容器:同一签名、同一信封;逐成员由 version 位区分,一个归档可混合 v50 与 v70 成员。
11.2 大字典编码
dict = (32+frac) << (power+12)
= (128KiB<<power) + (128KiB<<power)/32 × frac
dict_power 5 位(10–14,编码端 n ≤ 19),dict_frac 5 位(15–19),允许非 2 的幂;32+frac 最大 63,故字典最大 126 GiB(64 GiB 基数 + 31/32 增量)。
11.3 DCX 距离表
DC 表从 64 扩到 80 码(HUFF_DCX):距离槽上限 79 → DBits 38 → 距离可达 ~1 TB。解码用 u64(§6.5 公式不变,slot 上限放宽)。
11.4 与 rars 差异
rars 解析压缩信息 bit 20(rar5_compat)。rar-rs 不写该位、读取忽略(WinRAR 7.23 双向验证通过,不需要它)。其余(v0/v1 字典公式、算法版本上限、solid/方法位)两实现一致。
12 · 与 rars / rar-research 的差异清单
| # | 主题 | rars / rar-research | rar-rs(本文为准) |
|---|---|---|---|
| 1 | RAR7 压缩信息 bit 20 | 解析 rar5_compat | 不写、读取忽略 |
| 2 | RAR4 兼容 | 支持 RAR1.3–RAR4 | 读/解压支持 RAR1.3–RAR4;本文档仅覆盖 RAR5/RAR7 容器 |
| 3 | 过滤器类型 | 0–3 | 同 0–3;类型 4–7 显式报错 |
| 4 | 块头 CRC | 覆盖原始 vint 字节 | 相同 |
| 5 | 压缩块校验 | 0x5A ^ flags ^ size | 相同 |
| 6 | 结束头块标志 | — | 写 SKIP_IF_UNKNOWN(§4.6) |
| 7 | RAR7 字典公式 | (frac+32)<<(power+12) | 相同(代数等价) |
| 8 | 距离表 | RAR5 64 / RAR7 80 | 相同 |
| 9 | 加密填充 | — | zero-fill(非 PKCS7) |
| 10 | KDF | 链式 HMAC-SHA256 单链 | 相同(2^s / +16 / +32 三切点) |
| 11 | 内联 RR 分片 | 200 上限 | 相同 |
| 12 | SFX | 签名扫描 | 相同 |
| 13 | 分卷命名 | name.partN.rar | 相同 |
附录 A · 常量速查
签名 / 块类型
签名 Rar!\x1a\x07\x01\x00 · REV5 Rar!\x1aRev
0x01 归档 / 0x02 文件 / 0x03 服务 / 0x04 加密 / 0x05 结束
块标志
0x0001 extra · 0x0002 data · 0x0004 skip
0x0008 cont · 0x0010 cont-to
0x0020 depends-prev · 0x0040 preserve-child
归档标志
0x0001 volume · 0x0002 vol-num · 0x0004 solid
0x0008 recovery · 0x0010 locked
文件标志
0x0001 dir · 0x0002 time · 0x0004 crc32 · 0x0008 unknown-size
压缩信息位
0–5 version · 6 solid · 7–9 method
10–14 dict · 15–19 frac · 方法 0 store / 1–5 级别
OS 0 windows / 1 unix
extra 记录
0x01 加密 · 0x02 哈希 · 0x03 时间 · 0x04 版本
0x05 重定向 · 0x06 owner · 0x07 服务数据
重定向类型
0x01 unix-link · 0x02 win-link · 0x03 junction
0x04 hardlink · 0x05 file-copy
Huffman / 压缩块
NC 306 / DC 64 / DCX 80 / LDC 16 / RC 44 / BC 20;码长 ≤ 15
0x5A 校验种子;发射块 ≤ 4 MiB(自适应早闭),解析预算 128 KiB(0x20000)
过滤器 / 加密
0 Delta / 1 E8 / 2 E8E9 / 3 ARM;区域 ≤ 0x3FFFF
AES-256-CBC;盐 16 / IV 16 / 校验 12;KDF 2^15 默认
GF(2¹⁶)
本原多项式 0x1100b
Cauchy M[i][j] = inv((i+ND) ^ j)
附录 B · 参考来源
- · 权威:rar-rs 实现(crates/rar/src/format/rar5/{mod,payload,extract}.rs、format/rar5/headers/{parse,serialize,locator,quick_open}.rs、format/rar5/write/{mod,engine,layout}.rs、codec/modern/lzss_huff/{encoder,decoder}.rs、crypto/rar50.rs、recovery/{rar50,rev50}.rs),WinRAR 7.23 双向互操作验证。
- · 交叉核对:bitplane/rars(crates/rars/src/rar50*.rs)与 rar-research 规格书;冲突处以本实现为准。
- · 位流格式源自对 libarchive archive_read_support_format_rar5.c(Grzegorz Antoniak, 2018, BSD-2-Clause)的独立分析。