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

自定义Base64解码脚本报错TypeError: must be str, not bytes求助

问题排查与修复方案

核心报错原因

  • 用rb模式读取文件时,infile.read(1)返回bytes类型,但table_str.find()方法仅接受str类型参数,类型不匹配触发TypeError。
  • 代码还存在其他隐性问题:
    • 条件判断data == ""错误:bytes对象不能直接和空字符串比较,应改为data == b""
    • div = len(x) / 8在Python3中返回浮点数,切片时会报错,需改为整数除法//
    • out_file.write(chr(num))在wb模式下需写入bytes对象,而非str,会触发类型错误
    • out_file.close缺少括号,未执行实际的文件关闭操作

修复后的完整代码

#!/usr/bin/python
import sys

infile = open(sys.argv[1], 'rb')

table_str = "/+9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA"
table = list(table_str)

x = ""
while True:
    data = infile.read(1)
    if data == b"":
        break
    if data == b"=":
        break
    # 将bytes转为str(Base64字符均在ASCII范围内,解码无风险)
    data_str = data.decode('utf-8')
    data2 = bin(table_str.find(data_str))[2:].zfill(6)
    x += str(data2)

mod = len(x) % 8
if mod != 0:
    div = len(x) // 8  # 改用整数除法避免浮点数
    x = x[0:div*8]

out_file = open('out', 'wb')

i = 0
while i < len(x):
    num_str = ""
    j = 0
    while j < 8:
        num_str += x[i]
        i += 1
        j += 1
    num = int(num_str, 2)
    out_file.write(bytes([num]))  # 转为bytes对象适配wb模式

out_file.close()  # 执行文件关闭
infile.close()

关键修复点说明

  1. 类型统一:每次读取bytes后,用data.decode('utf-8')转为str,再传入table_str.find()
  2. 条件判断修正:将字符串比较改为bytes比较,保持类型一致
  3. 整数除法:把/换成//,避免浮点数导致切片索引错误
  4. 写入格式适配:用bytes([num])将整数转为单字节bytes对象,符合wb模式的写入要求
  5. 资源释放:给close()添加括号,确保文件资源被正确释放

内容的提问来源于stack exchange,提问作者Alabama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:04:02