【问题标题】:python3 - TypeError: can't concat bytes to strpython3 - TypeError:无法将字节连接到str
【发布时间】:2018-01-01 01:50:33
【问题描述】:

代码如下:

def flip_bytes(binary_f):
    i = random.randint(0, len(binary_f))
    c = chr(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()))

license 是一个 ELF 可执行文件,当我运行脚本时出现此错误:

Traceback (most recent call last):
  File "parse.py", line 30, in <module>
    copy_binary()
  File "parse.py", line 11, in copy_binary
    fuzz_f.write(flip_bytes(orig_f.read()))
  File "parse.py", line 7, in flip_bytes
    return binary_f[:i] + c + binary_f[i+1:]
TypeError: can't concat bytes to str

我该如何解决这个问题?

(这是whole script以防万一)

【问题讨论】:

    标签: python-3.5 elf


    【解决方案1】:

    改变:

    c = chr(random.randint(0, 0xFF))
    

    到:

    c = bytes([random.randint(0, 0xFF)])
    

    Python 3 有单独的 bytes 和 str 类型。根据文档,bytes 是 bytearray 的不可变版本:

    https://docs.python.org/3.1/library/functions.html#bytes

    https://docs.python.org/3.1/library/functions.html#bytearray

    如果您将一个数字传递给 bytes/bytearray 构造函数,它会将其解释为初始缓冲区大小,而不是单个字节的初始值。这就是为什么你必须向它传递一个包含被解释为字节的数值的列表(它们必须包含 0-255,否则会引发异常)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多