字符串与bytes拼接问题:修复Python Netcat替代代码报错
修复Python Netcat替代工具的字节/字符串兼容问题
原代码的核心问题是Python3中socket的recv()返回bytes对象,send()要求传入bytes,但代码里混用了字符串和bytes类型,导致拼接、判断时出现类型错误。以下是完整修复方案:
修复后的完整代码
import socket class Netcat: """ Python 'netcat like' module """ def __init__(self, ip, port): self.buff = b"" # 改为bytes类型缓冲区 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((ip, port)) def read(self, length=1024): """ Read 1024 bytes off the socket """ return self.socket.recv(length) def read_until(self, data): """ Read data into the buffer until we hit the target data """ # 自动将字符串参数转为bytes if isinstance(data, str): data = data.encode('utf-8') while data not in self.buff: self.buff += self.socket.recv(1024) pos = self.buff.find(data) rval = self.buff[:pos + len(data)] self.buff = self.buff[pos + len(data):] return rval def write(self, data): # 自动将字符串参数转为bytes后发送 if isinstance(data, str): data = data.encode('utf-8') self.socket.send(data) def close(self): self.socket.close() # 使用示例 nc = Netcat('192.168.0.1', 80) # 读取到提示符(支持直接传字符串) nc.read_until('>') # 发送命令(支持直接传字符串) nc.write('new\n') nc.read_until('>')
关键修改说明
- 缓冲区类型统一:把
self.buff初始化为b""(bytes空值),避免字符串和bytes拼接的类型错误 - 自动类型兼容:在
read_until()和write()方法中加入判断,若传入的是字符串则自动编码为bytes,调用时无需手动处理,保持接口易用性 - bytes操作一致性:所有缓冲区的查找、切片操作都基于bytes类型,和socket的recv/send行为匹配
内容的提问来源于stack exchange,提问作者frosted flakes
相关产品推荐
相关产品推荐

