能否用Python在二进制文件中注入并移动数据?指定位置注入实操问询
用Python在二进制文件中注入并移动数据的实现方法
当然可以实现,不过二进制文件本身没有原生的“插入”功能,要在已有数据中间注入新内容,需要先把插入位置之后的数据临时保存,写入新数据后再把原后续数据追加回去;或者直接将整个文件读入内存修改后重新写入(适合小文件)。
针对你的场景,原文件通过追加模式写入了b'A'和b'C',最终文件内容是b'AC',要在A(位置0)和C(位置1)之间注入b'B',让f.seek(1)能读取到B,可以用以下两种方法:
方法1:全文件读入内存修改(适合小文件)
这种方法简单直接,把整个文件内容读入内存,在指定位置插入数据后重新写入文件:
# 读取原文件内容 with open("inject.bin", "rb") as f: content = f.read() # 在索引1的位置插入B(原C的位置) new_content = content[:1] + b'B' + content[1:] # 将修改后的内容写回文件 with open("inject.bin", "wb") as f: f.write(new_content) # 验证效果 with open("inject.bin", "rb") as f: f.seek(1) print(f.read(1)) # 输出 b'B'
方法2:局部读写(适合大文件)
如果文件很大,不适合全读入内存,可以通过定位读写,先保存插入位置后的内容,再写入新数据和原后续内容:
insert_position = 1 insert_data = b'B' with open("inject.bin", "rb+") as f: # 移动到插入位置,读取后面的所有数据 f.seek(insert_position) remaining_data = f.read() # 回到插入位置,写入要注入的B f.seek(insert_position) f.write(insert_data) # 写入之前保存的后续数据(原C) f.write(remaining_data) # 验证效果 with open("inject.bin", "rb") as f: f.seek(1) print(f.read(1)) # 输出 b'B'
注意事项
- 不要用
ab模式做修改,ab模式始终在文件末尾追加内容,无法定位到中间位置写入。 - 使用
rb+模式时,它支持读写操作且不会截断原文件,适合做局部修改;wb模式会清空原文件,只适合全量覆盖写入。
内容的提问来源于stack exchange,提问作者Bob van Luijt
相关产品推荐
相关产品推荐

