You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者うちわ 密か

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:38