基于三个损坏RAR文件的交集恢复完整文件可行性咨询
利用三个损坏的RAR文件拼接完整文件的方法
嘿,这个思路真的很聪明!三次下载的同文件损坏位置大概率不一样,确实可以通过提取三个文件里的完好部分拼接出完整的RAR包。不用diff/comm也完全能做到,给你两个实用的方案:
方案一:用简单的Python脚本自动修复(最推荐)
这个脚本会逐字节读取三个文件,对每个位置的字节进行"投票"——选出现次数最多的字节写入新文件。如果某个位置只有一个文件损坏,另外两个的字节一致,就会自动取正确的那个;即使两个文件损坏,只要第三个是好的,也能正确提取。
import os # 替换成你的三个损坏RAR文件路径 file_paths = ["corrupt1.rar", "corrupt2.rar", "corrupt3.rar"] output_path = "fixed.rar" # 先检查三个文件大小是否一致(必须是同一源文件的损坏版) file_sizes = [os.path.getsize(path) for path in file_paths] if not all(size == file_sizes[0] for size in file_sizes): print("错误:所有文件必须大小完全一致!") exit() with open(output_path, "wb") as output_file: # 同时打开三个输入文件 with open(file_paths[0], "rb") as f1, open(file_paths[1], "rb") as f2, open(file_paths[2], "rb") as f3: processed_bytes = 0 while True: # 每次读取一个字节 b1 = f1.read(1) b2 = f2.read(1) b3 = f3.read(1) # 读到文件末尾就停止 if not b1: break # 统计每个字节出现的次数 byte_votes = {b1: 0, b2: 0, b3: 0} byte_votes[b1] += 1 byte_votes[b2] += 1 byte_votes[b3] += 1 # 选择得票最多的字节写入新文件 selected_byte = max(byte_votes, key=byte_votes.get) output_file.write(selected_byte) processed_bytes += 1 # 每处理1MB打印一次进度 if processed_bytes % 1048576 == 0: print(f"已处理 {processed_bytes // 1048576} MB...") print(f"修复完成!请尝试解压生成的 {output_path}")
运行方法:
- 把三个损坏文件放在同一个文件夹里,命名成
corrupt1.rar、corrupt2.rar、corrupt3.rar(或者修改脚本里的file_paths路径) - 把上面的代码保存成
fix_rar.py - 在命令行里运行
python fix_rar.py,等待处理完成
方案二:先试试RAR自带的修复功能
很多时候,单个损坏的RAR包其实可以用官方工具直接修复,先试试这个更简单的方法:
- 如果你用的是Windows,找到WinRAR的安装目录(比如
C:\Program Files\WinRAR),在命令行里进入该目录,然后运行:rar r corrupt1.rar - 如果你用的是Linux/macOS,安装
rar工具后,直接在命令行运行上面的命令 - 对另外两个损坏文件也重复这个操作,说不定其中一个能直接修复成功,省得折腾拼接的事
补充说明
如果脚本生成的文件还是解压失败,可能是某个位置三个文件都损坏了(这种概率很低,除非下载时的网络问题是固定损坏某个区域)。这时候可以用十六进制编辑器(比如HxD)打开三个文件,找到解压报错的位置,手动对比三个文件的字节,选择看起来更合理的那个(比如和周围字节的规律匹配)进行替换。
内容的提问来源于stack exchange,提问作者Camill
相关产品推荐
相关产品推荐

