2015-11-04 41 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