bt-patch 是一个 Rust 命令行工具,用于修补部分下载完成但存在空洞的文件。它支持两种工作方式:
- 手动按偏移复制指定区间
- 基于锚点自动定位并修补零字节空洞
这个工具面向“目标文件不完整,但你手上还有完整文件或可用于补丁的数据源”的场景,重点是尽量安全地修补,而不是猜测性写入。
- 支持
manual、auto-once、auto-all三个子命令 - 自动模式按连续零字节区间扫描候选空洞
- 自动定位时优先使用前锚点,并在可用时叠加后锚点确认
- 文件开头缺失时,后锚点也可以作为主要定位依据
- 默认流式处理,适合大文件
- 支持
dry-run、备份输出、写入新文件 - 手动模式支持
sha256:<hex>校验 - 运行时进度显示到
stderr - 帮助信息、错误信息、报告信息可根据系统语言显示中文或英文
- 输出中的偏移和长度会同时显示十进制和十六进制
- BT 或其他分块下载产生了连续零字节空洞
- 你已经拿到一份完整文件,或至少拿到包含正确内容的补丁源文件
- 你知道准确偏移,想做一次精确覆盖
- 你不知道偏移,但空洞附近内容仍可作为锚点定位
- 非零字节但内容错误的损坏区域
- 需要自动处理多文件 torrent 路径映射
- 需要联网下载缺失分块
- 需要依赖
.torrentpiece hash 做完整校验
要求:
- Rust 工具链
- Cargo
构建:
cargo build --releaseWindows 下生成的可执行文件通常位于:
target\release\bt-patch.exe
开发调试时可直接运行:
cargo run -- <COMMAND> [OPTIONS]bt-patch <COMMAND> [OPTIONS]子命令:
manual:按明确偏移修补目标区间auto-once:扫描零字节空洞,只修补第一个唯一匹配的空洞auto-all:扫描零字节空洞,修补全部唯一匹配的空洞
用途:你已经知道目标文件偏移、补丁源偏移和长度,希望做精确写入。
bt-patch manual [OPTIONS]参数:
-t, --target <FILE>:目标文件-p, --patch <FILE>:补丁源文件-T, --target-offset <U64>:目标文件写入起始偏移-P, --patch-offset <U64>:补丁源读取起始偏移-l, --length <U64>:复制字节数-d, --dry-run:仅输出计划,不修改文件-b, --backup:写入前创建<target>.bak-o, --output <FILE>:输出到新文件,不直接修改目标文件-v, --verify <SPEC>:写入后校验目标区间,目前支持sha256:<hex>
示例:
bt-patch manual ^
-t partial.bin ^
-p full.bin ^
-T 0 ^
-P 0 ^
-l 1048576写入到新文件:
bt-patch manual ^
-t partial.bin ^
-p full.bin ^
-T 1048576 ^
-P 1048576 ^
-l 524288 ^
-o repaired.bin带校验:
bt-patch manual ^
-t partial.bin ^
-p full.bin ^
-T 0 ^
-P 0 ^
-l 4096 ^
-v sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef自动模式会从目标文件中扫描“连续零字节区间”,将其视为候选空洞,然后尝试在补丁源文件中定位对应内容。
核心规则:
- 先找连续零字节区间
- 优先提取空洞前方锚点
- 如果有后锚点,则叠加确认
- 如果前锚点不可用,后锚点也可以单独承担主定位
- 只有唯一匹配才允许写入
- 出现歧义时宁可跳过,不做猜测性修补
bt-patch auto-once [OPTIONS]用途:只修补第一个满足安全条件且唯一匹配的空洞。
bt-patch auto-all [OPTIONS]用途:依次扫描所有候选空洞,修补全部唯一匹配的空洞;无法安全修补的空洞会跳过并记录结果。
-t, --target <FILE>:目标文件-p, --patch <FILE>:补丁源文件-s, --search-start <U64>:扫描起始偏移,支持字节偏移或小数比例,例如0.7表示文件长度的 70%,默认0-z, --zero-threshold <U64>:最小零字节连续长度,默认1048576-a, --anchor-size <U64>:前后锚点大小,默认4096-m, --max-match-candidates <U32>:最大候选数,超过即视为歧义,默认32-d, --dry-run:仅输出计划,不修改文件-b, --backup:写入前创建<target>.bak-o, --output <FILE>:输出到新文件,不直接修改目标文件
示例:
bt-patch auto-once ^
-t partial.bin ^
-p full.bin从指定偏移开始扫描,并降低空洞阈值:
bt-patch auto-once ^
-t partial.bin ^
-p full.bin ^
-s 1048576 ^
-z 65536 ^
-a 4096批量修补全部唯一匹配空洞:
bt-patch auto-all ^
-t partial.bin ^
-p full.bin ^
-b仅预览修补计划:
bt-patch auto-all ^
-t partial.bin ^
-p full.bin ^
-d标准输出会给出本次执行的结果报告,例如:
- 模式
- 目标文件与补丁源文件
- 扫描起始偏移
- 锚点大小
- 发现的空洞数量
- 每个空洞的偏移、长度、匹配状态、修补状态
- 最终汇总
其中偏移和长度会同时显示十进制和十六进制,例如:
目标偏移:1048576 (0x100000)
长度:4096 (0x1000) 字节
耗时步骤的进度信息会输出到 stderr,包括:
- 扫描空洞
- 扫描补丁锚点
- 复制字节
- 校验字节
这样既能看到进度,也不会污染主结果报告。
0:执行成功,且至少完成一次修补;或dry-run成功生成计划1:执行完成,但没有可安全修补的空洞,或部分空洞失败导致结果为软失败2:参数错误或致命 I/O 错误
bt-patch 的默认策略是“宁可不修,也不误修”。
- 自动模式下,只有唯一匹配才允许写入
- 匹配歧义时直接跳过
- 不允许目标区间越界
- 不允许补丁源区间越界
dry-run不修改任何文件--output可避免直接污染原文件--backup可在原地写入前保留备份
建议流程:
- 先使用
-d, --dry-run预览计划 - 如需保留原文件,使用
-b或-o - 对明确偏移的修补优先使用
manual - 对自动定位结果有疑问时,先缩小
--search-start或调整--anchor-size
- 空洞很小:降低
--zero-threshold - 目标文件前部缺失:保持后锚点可用,自动模式会尝试后锚点主定位
- 锚点太短导致误匹配:增大
--anchor-size - 候选过多经常歧义:适当增大
--anchor-size,必要时缩小扫描范围 - 文件很大:优先设置合理的
--search-start,减少扫描时间
帮助信息、错误信息和结果报告会根据系统语言自动选择中文或英文。目前已提供:
- 中文
- 英文
你也可以直接查看命令帮助:
bt-patch --help
bt-patch manual --help
bt-patch auto-once --help
bt-patch auto-all --help- 只处理单文件修补
- 自动模式只把“连续零字节区间”视为候选空洞
- 不处理“内容错误但不是零”的损坏区间
- 不直接读取
.torrent元数据做 piece 校验 - 自动模式当前不提供
--verify
格式化:
cargo fmt测试:
cargo test --offline发布构建:
cargo build --release --offlineMIT