磁盘格式 · 权威可视化参考

RAR5 / RAR7 格式参考

以 rar-rs 实现为唯一权威(对照 WinRAR 7.23 逐字节互操作验证)。 与 bitplane/rars 及其 rar-research 规格书冲突处,以本实现为准。 所有 vint 为 RAR5 变长整数(§2.2);多字节整数一律小端。

块(block) 核心体(加密 / 压缩 / 恢复) 可选区域 / vint 软边界 陷阱 / 易错点 rar-rs 做法

1 · 心智模型:块流总览

RAR5/RAR7 是一个块流(block stream)格式:一个归档 = 一串首尾相接、无间隙的块。五种块共用同一个外层信封(§2/§4)。

可选 · SFX stub任意长度

自解压模块。起点 = 首个 Rar!\x1a\x07\x01\x00 签名(detect::sfx_offset_of)。

签名 · 8 字节52 61 72 21 1a 07 01 00

Rar! 后接 1A 07 01 00。RAR7 同此签名。

可选 · 归档加密头 0x04-hp

明文写(无 IV)。-hp 分卷的每一卷开头重复此块。

主归档头 · block 0x01归档标志 + Locator

含 VOLUME / SOLID / RECOVERY / LOCKED 标志;extra 区携带 QO/RR 偏移 locator。

文件头 + 数据区 · block 0x02每成员一组,重复 N 次

成员 = 文件头 + 紧跟数据区。数据区是 LZSS+Huffman 流,或(method=0 STORE)原文。压缩成员后跟一组压缩块(§6)。

可选 · QO 服务块 0x03归档尾部

quick-open 缓存:每个文件头的副本,使 listing 为 O(QO) 而非 O(archive)。

可选 · RR 内联恢复记录 0x03QO 之后

GF(2¹⁶) Cauchy 奇偶(§9.1)。-hp / 分卷下不可用。

归档结束头 · block 0x05SKIP_IF_UNKNOWN + 结束标志

块标志写 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 的位被忽略。

0 … 1270xxxxxxx(1 字节)
128 … 163831xxxxxxx 0xxxxxxx(2)
…最多 10 字节

⚠ 非规范定宽 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
偏移字节说明
0x0052 61 72 21 1a 07 01 00归档签名 Rar!\x1a\x07\x01\x00(8 字节)
0x08c5 1a 33 32头部 CRC32(LE)= 0x32331AC5,覆盖 [size vint 原字节] + body
0x0c03头部大小 vint = 3
0x0d01块类型 = 0x01(归档头)
0x0e00块标志 = 0
0x0f00归档标志 = 0(单卷 / 非 solid / 未锁定)
文件头 · block 0x02
偏移字节说明
0x106c 11 bb d1头部 CRC32(LE)= 0xD1BB116C
0x1448头部大小 vint = 0x48 = 72
0x1502块类型 = 0x02(文件头)
0x1603块标志 = 0x0001 | 0x0002 = EXTRA_DATA | DATA_AREA
0x170b额外区大小 vint = 11
0x180a数据区大小 vint = 10(packed 大小)
0x1906文件标志 = 0x0002 | 0x0004 = TIME_UNIX | CRC32
0x1a0a解压大小 vint = 10
0x1ba4 83 02属性 vint = 0o100644(Unix 普通文件)
0x1e76 aa 92 6a4 字节 LE mtime = 0x6A92AA76
0x229d d2 80 b14 字节 LE CRC32(明文 hello rar\n)
0x2600压缩信息 vint = 0 → v0(RAR5) · solid0 · method0(store) · dict0
0x2701host OS = 1(Unix)
0x2829名字长度 vint = 0x29 = 41
0x29…0x5143 3a 2f … 74 78 74名字 UTF-8 = C:/Users/.../tiny.txt(41 字节)
额外区(11B)· 数据区(10B)· 结束头(block 0x05)
偏移字节说明
0x520a额外记录大小 vint = 10(含类型字节)
0x5303额外记录类型 = 0x03(HTIME 文件时间)
0x5413HTIME 标志 = 0x01|0x02|0x10(unix|mtime|ns)
0x55…0x5876 aa 92 6a4 字节 LE mtime 秒 = 0x6A92AA76
0x59…0x5c58 6a b8 164 字节 LE mtime 纳秒 = 0x16B86A58(≈ 0.381 s)
0x5d…0x6668 65 6c 6c 6f 20 72 61 72 0a数据区:hello rar\n(STORE,原样)
0x671d 77 56 51结束头 CRC32(LE)= 0x5156771D
0x6b03头部大小 vint = 3
0x6c05块类型 = 0x05(结束头)
0x6d04块标志 = 0x0004(SKIP_IF_UNKNOWN,⚠ 见 §4.6)
0x6e00结束标志 = 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 区]

归档标志

0x0001VOLUME分卷集一员
0x0002VOLUME_NUM后随卷号(1 起)
0x0004SOLID固态归档
0x0008RECOVERY含内联 RR
0x0010LOCKED已锁定

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 区?]

文件标志

0x0001DIRECTORY目录条目(无数据区)
0x0002TIME_UNIX4 字节 Unix mtime
0x0004CRC324 字节 CRC32
0x0008UNKNOWN_SIZE解压大小未知(流式)

压缩信息 vint · 位布局

bit 0–5version0=RAR5 / 1=RAR7
bit 6solid共享 LZ 窗口
bit 7–9method0=store, 1–5=级别
bit 10–14dictRAR5 4 位幂(10–13)/ RAR7 5 位幂
bit 15–19dict_fracRAR7 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
QOquick-open 缓存空记录(仅类型字节)DATA_AREA + SKIP_IF_UNKNOWN
RR内联恢复奇偶数据1 字节恢复百分比DATA_AREA + SKIP_IF_UNKNOWN
STMNTFS 备用流内容流名 :nameDATA_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重定向链接/复制成员(无数据区)
0x06owner/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

BC20编码其余表的码长
NC306主符号
DC64 / 80(DCX)距离低位
LDC16大距离低 4 位
RC44过滤器参数

码长串联经 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 自动发现全卷。

卷 1 · part1.rar[加密头?][主头][成员…][结束头 · NEXT_VOLUME]
卷 2 · part2.rar[加密头?][成员…][结束头 · NEXT_VOLUME]
卷 N · partN.rar(末卷)[加密头?][成员…][QO?][RR?][结束头 · 0]

跨卷成员:旧卷写 DATA_CONTINUES 块(非末块头带密文 CRC32),新卷写 DATA_CONTINUE_TO 块(末块头带 MAC 明文 CRC + 完整 extra 区)。支持创建/读取/删除/重命名跨卷成员;不支持分卷 append、分卷锁定、分卷注释、分卷内联 RR(官方 rar 同样拒绝)。恢复卷见 §9.2。

9 · 恢复记录

9.1 内联 RR · {RB} 块固定头 0x48 + 状态表 + 奇偶

0x00"{RB}" 标记 (4)
0x04CRC64-XZ (8)
0x0ctotal_size (4 LE)
0x10header_size (4 LE)
0x14= 1 版本
0x22protected_size (8)
0x2agroup_count (8)
0x32shard_size (8)
0x3adata_shards (u16)
0x3crecovery_shards (u16)
0x3eshard_index (u16)
… 8×N 状态表 + 奇偶数据 (group_count 字节)

规划:受保护前缀 ≥ 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)

D₀
D₁
D₂
…
P₀
m₀₀
m₀₁
m₀₂
…
P₁
m₁₀
m₁₁
m₁₂
…
P₂
m₂₀
m₂₁
m₂₂
…

奇偶字节 = 分片字节(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
  • · 块信封 / 五种块
  • · 加密 / 恢复体系
压缩信息 vint
version
bit 0–5

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-researchrar-rs(本文为准)
1RAR7 压缩信息 bit 20解析 rar5_compat不写、读取忽略
2RAR4 兼容支持 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)
7RAR7 字典公式(frac+32)<<(power+12)相同(代数等价)
8距离表RAR5 64 / RAR7 80相同
9加密填充—zero-fill(非 PKCS7)
10KDF链式 HMAC-SHA256 单链相同(2^s / +16 / +32 三切点)
11内联 RR 分片200 上限相同
12SFX签名扫描相同
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)的独立分析。