我得到TypeError:'str'不支持中的缓冲区

2024-04-25 17:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用套接字连接到FTP服务器。我在学习网络编程,所以我不想使用ftplib。我搜索了stackoverflow的所有地方,因为有类似的问题,我尝试了解决方案堆栈用户必须提供的一切,但到目前为止没有一个有效。知道怎么回事吗?你知道吗

def connect_to_target(username, password):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((target, 21))
    data = s.recv(1024).decode()
    s.send('USER' + username + '\r\n').encode()
    data = s.recv(1024).decode()
    s.send('PASS' + password + '\r\n').encode()
    data = s.recv(3).decode()
    s.send('QUIT\r\n')
    s.close()
    return data

翻译说问题出在第13行

s.send('USER' + username + '\r\n').encode(). 

我试过一种不同的方法,比如:

s.send('USER' + username + '\r\n'.encode())

当我尝试后者时,它给了我:

TypeError: Can't convert 'bytes' object to str implicitly

Tags: to网络服务器sendtargetdataconnectusername
2条回答

s.send()需要一个编码字节流作为参数。所以你想要像s.send(str.encode())这样的东西。你知道吗

当你这么做的时候

s.send('USER' + username + '\r\n').encode()

不是对字符串进行编码,而是对s.send()的返回值进行编码。它读起来像s.send(str).encode(),这不是你想要的。你知道吗

你的第二次尝试更接近我们应该有的,但在这种情况下,你没有注意到运算符的优先级。你知道吗

s.send('USER' + username + '\r\n'.encode())

这与首先执行'\r\n'.encode(),然后将字符串(username)与不允许的bytes对象('\r\n'.encode())连接在一起是一样的。这个表达式的形式是s.send(str2 + str.encode()),其中.运算符的优先级高于+运算符,就像数学中加法之前先乘法一样。你知道吗

您希望对整个字符串进行编码。您这样做的方式只编码字符串的'\r\n'部分。你知道吗

因此,需要用括号将字符串串联起来,以便在编码之前首先执行串联。因此,您需要:

s.send(('USER' + username + '\r\n').encode())
#      ^                          ^ notice the parentheses here

这就是我们之前期望的s.send(str.encode())形式。你知道吗

对于这条线

s.send('USER' + username + '\r\n').encode()

您调用encode就像它是从s.send返回的任何内容的方法一样,这可能不是您想要的。你知道吗

对于这条线

s.send('USER' + username + '\r\n'.encode())

您只对序列中的最后一个字符串调用encode

'\r\n'.encode()

由于其中一个字符串已编码(到bytes类型),而其他字符串仍然是正常的str类型,因此结果串联将不起作用。你知道吗

为了让它工作,你需要创建一个包含整个批次的字符串,然后encode。你知道吗

s.send('USER{}\r\n'.format(username).encode())

由于+运算符的原因,将在不创建任何临时字符串的情况下执行此操作。你知道吗

相关问题 更多 >