2015-11-04 27 views
1

基本上我想打包,從我的客戶端發送字符到我的服務器,Python和我有一個字符串,我想通過一個這樣的發送其字符之一:Python的結構發送字符

a='abcd' 
s.sendall(struct.pack("!c",a[0])) 

由此我想發送字母'a'。但是我得到錯誤「字符格式需要長度爲1的字節對象」。

我研究過,它說我應該在我的字符之前加上一個b,像b'a',但由於我的字符存儲在一個變量中,我該怎麼做?

也有一種方法來打包一個字符串與結構沒有做char char?

我想要做的事:

 a = 'ab cd ef ' 
     nrel = len(a) 
     c.send(struct.pack("!i", nrel)) //send the length 
     for i in range (0,nrel): 
      c.send(struct.pack("!c",a[i].encode('ascii'))) //send each char one by one 

而且在服務器:

 nr = c_socket.recv(4096) 
     nr = struct.unpack("!i",nr)[0] 
     cuv = '' 
     for i in range (0,nr): 
      el = c_socket.recv(4096) 
      ch = struct.unpack("!c",el)[0].decode('ascii') //fails after reading the second letter 
      cuv = cuv + ch 
+0

你使用Python 2或3嗎? –

+0

我正在使用Python 3 – Mocktheduck

回答

3

編碼您的字符串:

a = 'abc' 
p = struct.pack("!c", a[0].encode('ascii')) 

打開包裝,編碼爲字符串:

string_a = struct.unpack("!c", p)[0].decode('ascii') 

您也可以對整個字符串進行編碼並以循環方式發送字節。

a = 'ab cd ef '.encode('ascii') 
nrel = len(a) 
send(struct.pack("!i", nrel)) 
for i in range (nrel): 
    send(struct.pack("!b",a[i])) 
+0

這有效,但現在我的拆箱不起作用。我如何解開它? – Mocktheduck

+0

添加解包來回答。 –

+0

它適用於第一個字母,對於第二個字母,它會拋出一個錯誤「解壓縮需要一個長度爲1的字節對象」 – Mocktheduck

0

也許你可以嘗試將字符串轉換使用字節組( 「ABCD」)的ByteArray。

+0

我不確定這將如何處理我的代碼我對Python很陌生,我會打包和解包這個字符串 – Mocktheduck