Python3报错TypeError:无法拼接bytes与str,求修复方案
修复TypeError: can't concat bytes to str的问题
这个报错的核心原因很明确:你用rb模式读取ELF文件时,得到的是bytes对象,但chr()函数返回的是字符串(str),Python不允许直接把这两种不同类型的数据拼接在一起,所以抛出了类型错误。
下面给你两种可行的修复方案,任选其一即可:
方案一:直接生成bytes类型的字节(推荐)
既然我们要操作二进制数据,直接生成bytes对象是最直观的方式,避免字符串和字节的转换开销:
import random def flip_bytes(binary_f): # 先处理空文件的边界情况,防止索引越界 if not binary_f: return binary_f # 随机选择一个已存在的字节索引(替换模式),如果想允许在末尾追加字节,可改回len(binary_f) i = random.randint(0, len(binary_f) - 1) # 直接生成单个字节的bytes对象 c = bytes([random.randint(0, 0xFF)]) return binary_f[:i] + c + binary_f[i+1:] def copy_binary(): with open("license", "rb") as orig_f, open("license_fuzz", "wb") as fuzz_f: fuzz_f.write(flip_bytes(orig_f.read()))
方案二:将字符串编码为bytes
如果你坚持想用chr()生成字符,只需把字符串编码为字节即可,注意要用latin-1编码(它能完美映射0-0xFF的所有字节,不会出现编码错误):
import random def flip_bytes(binary_f): i = random.randint(0, len(binary_f)) # 将字符串编码为bytes类型 c = chr(random.randint(0, 0xFF)).encode('latin-1') return binary_f[:i] + c + binary_f[i+1:] def copy_binary(): with open("license", "rb") as orig_f, open("license_fuzz", "wb") as fuzz_f: fuzz_f.write(flip_bytes(orig_f.read()))
额外说明
原代码中i = random.randint(0, len(binary_f))会允许i等于文件字节长度,这时候相当于在文件末尾追加一个字节,而不是替换原有字节。如果你的需求是随机翻转一个已有字节,建议把i的范围改成0到len(binary_f)-1,就像方案一那样,避免出现追加的情况。
内容的提问来源于stack exchange,提问作者うちわ 密か
相关产品推荐
相关产品推荐

