2015-11-04 3 views
1

В основном я хочу, чтобы упаковать и отправить символы из моего клиента к серверу, в Python и у меня есть строка, и я пытаюсь отправить его символы один за другим, как это:Python STRUCT посылающих символы

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

Под этим я хочу отправить письмо «a». Но я получаю формат «char» ошибки, для которого требуется объект байтов длиной 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

Может быть, вы можете попробовать преобразовать строку в ByteArray с помощью ByteArray ("ABCD").

+0

Я не уверен, как это будет работать с моим кодом Я довольно новичок в Python, и я буду упаковывать и распаковывать эту строку – Mocktheduck