2017-03-04 54 views
0

我試圖升級舊的Python 2.x類以使用3.x(由其他人編寫,而不是維護)。這是一個片段。struct.error:'s'的參數必須是字節對象

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())。 回溯:

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 
+0

你試過編碼了嗎?另外,你可能需要*編碼後的長度*。 –

回答

0

我想通了。 pack()函數中的兩個參數必須轉換爲字節。

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