如何用Python替换字节文件中的十六进制值?问题求助
解决字节文件十六进制内容替换失效问题
你的代码失效的核心原因是错误地将十六进制字符串按UTF-8编码转换为字节,而不是将十六进制解析为对应的二进制字节。例如,你输入"04"时,代码会生成b'04'(两个ASCII字节),但文件中实际存储的是单个二进制字节0x04,两者完全不匹配,自然无法完成替换。
修正方案
需要先将空格分隔的十六进制字符串解析为二进制字节序列,再执行替换。以下是适配你具体需求的修正代码:
直接针对你的修改需求的代码
def hex_to_bytes(hex_str): # 去除空格后按十六进制规则转换为字节 hex_clean = hex_str.replace(" ", "") return bytes.fromhex(hex_clean) # 定义需要替换的两组十六进制内容 targets = [ ("04", "05"), ("00 00 00 00", "01 00 00 00") ] # 读取文件内容 with open('hero.bytes', 'rb') as f: data = f.read() # 依次执行替换 for ori_hex, mod_hex in targets: ori_bytes = hex_to_bytes(ori_hex) mod_bytes = hex_to_bytes(mod_hex) data = data.replace(ori_bytes, mod_bytes) # 写回修改后的内容 with open('hero.bytes', 'wb') as f: f.write(data)
支持用户交互输入的通用版本
如果你需要保留输入交互功能,可以使用以下代码:
def hex_to_bytes(hex_str): hex_clean = hex_str.replace(" ", "") return bytes.fromhex(hex_clean) ori = input("输入要替换的十六进制内容(空格分隔):") mod = input("输入替换后的十六进制内容(空格分隔):") ori_bytes = hex_to_bytes(ori) mod_bytes = hex_to_bytes(mod) with open('hero.bytes', 'rb') as f: data = f.read() data = data.replace(ori_bytes, mod_bytes) with open('hero.bytes', 'wb') as f: f.write(data)
使用说明:
- 输入十六进制内容时保持空格分隔格式(比如输入
00 00 00 00匹配你要修改的那段),代码会自动转换为正确的二进制字节。 - 针对你的需求,运行通用版代码时,可分两次执行:第一次输入
04替换为05,第二次输入00 00 00 00替换为01 00 00 00。
内容的提问来源于stack exchange,提问作者Khánh Đàm
相关产品推荐
相关产品推荐

