自定义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()
关键修复点说明
- 类型统一:每次读取bytes后,用
data.decode('utf-8')转为str,再传入table_str.find() - 条件判断修正:将字符串比较改为bytes比较,保持类型一致
- 整数除法:把
/换成//,避免浮点数导致切片索引错误 - 写入格式适配:用
bytes([num])将整数转为单字节bytes对象,符合wb模式的写入要求 - 资源释放:给
close()添加括号,确保文件资源被正确释放
内容的提问来源于stack exchange,提问作者Alabama
相关产品推荐
相关产品推荐

