struct.error:' s'必须是一个字节对象

时间:2017-03-04 02:38:12

标签: python-3.x

我尝试升级旧的Python 2.x类以使用3.x(由其他人编写,而不是维护)。这是一个片段。

 def getByte(self):
    if (self.available < 1):
        self.request(4096);
    self.available = self.available - 1
    result = ord(self.bytes[0]);
    self.bytes = self.bytes[1:]
    return result

def request(self, size):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((self.host, self.port))
    contentSize = len(self.user)+len(self.password)+6;
    contentString = "!BHB"+str(len(self.user))+"sB"+str(len(self.password))+"sL"
    data = pack(contentString, 0, contentSize, len(self.user), self.user, len(self.password), self.password, size)
    sock.sendall(data)
    print("Sent!")
    data = sock.recv(6)
    fields = unpack("!BBL", str(data));
    if (fields[0] != 0):
        raise(ServiceDeniedError(fields[0],fields[1]))

    self.bytes = sock.recv(fields[2]);
    self.available = len(self.bytes);
    print("Received: ")
    print(self.available)
    sock.close()

使用print (rand.getByte())导入和调用。 回溯(traceback):

print (rand.getByte())

self.request(4096);

data = pack(contentString, 0, contentSize, len(self.user), self.user, len(self.password), self.password, size)

struct.error: argument for 's' must be a bytes object

1 个答案:

答案 0 :(得分:1)

我明白了。 pack()函数中的两个参数必须转换为字节。

data = pack(contentString, 0, contentSize, len(self.user), bytes(self.user, 'utf-8'), len(self.password), bytes(self.password, 'utf-8'), size)