Python: Как передать переменные массивы длины по сетевому соединению

Я должен передать массив переменной длины, в которой каждый элемент является кортежем двух целых чисел. Как пример:

path = [(1,1),(1,2)]
path = [(1,1),(1,2),(2,2)]

Я пытаюсь использовать пакет и распаковать, однако, так как массив имеет переменную длину, которую я не знаю, как создать формат, таким образом, что оба знают формат. Я пытался превратить его в единственную строку с разделителями, такими как:

msg = 1&1~1&2~
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg))

на стороне получения:

path = unpack("s",msg)

но это просто печатает 1 в этом случае. Я также пытался отправить 4 целых числа также, которые отправляют и получают прекрасный, пока я не включаю дополнительную строку, представляющую путь.

sendMsg = пакет ("hhhh", p.direction [0], p.direction[1], p.id, p.health)

на получить стороне:

x,y,id,health = unpack("hhhh",msg)

Первое было для иллюстрации, поскольку я пытался отправить формат "hhhhs", но так или иначе путь не проникает правильно.

Слова благодарности для Вашей справки. Я буду также смотреть на отправку 2D массива ints, но я, может казаться, не выясняю, как отправить эти более 'сложные' структуры по сети.

Слова благодарности для Вашей справки.

5
задан Devin 27 March 2010 в 20:44
поделиться

5 ответов

Взгляните на xdrlib , это может помочь. Это часть стандартной библиотеки и:

Модуль xdrlib поддерживает стандарт представления внешних данных, как описано в RFC 1014 , написанном Sun Microsystems, Inc., июнь 1987 г. Он поддерживает большинство типов данных. описано в RFC.

0
ответ дан 14 December 2019 в 04:34
поделиться

Несмотря на то, что вы можете использовать pack и unpack, я бы рекомендовал использовать что-то вроде YAML или JSON для передачи ваших данных.

  • Упаковка и распаковка могут привести к трудным для отладки ошибкам и несовместимости, если вы измените свой интерфейс и разные версии будут пытаться взаимодействовать друг с другом.
  • Pickle может вызвать проблемы с безопасностью , а формат pickle может меняться между версиями Python.

JSON включен в стандартный дистрибутив Python начиная с версии 2.6. Для YAML есть PyYAML .

7
ответ дан 14 December 2019 в 04:34
поделиться

Вам нужен какой-то протокол сериализации. twisted.spread предоставляет один из них (см. спецификацию Banana или документацию Perspective Broker ). Буферы протокола JSON или были бы более подробными примерами.

См. Также Сравнение форматов сериализации данных .

1
ответ дан 14 December 2019 в 04:34
поделиться

Если вы включите длину сообщения как часть сообщения, то вы будете знать, сколько данных нужно прочитать. Таким образом, вся строка должна быть прочитана по сети.

В любом случае, возможно, вам будет полезно опубликовать код, который вы используете для передачи данных по сети, или хотя бы дать более подробное описание.

0
ответ дан 14 December 2019 в 04:34
поделиться

Упаковка и распаковка обязательны? Если нет, то можно использовать JSON и YAML.

Не используйте pickle, потому что это небезопасно.

0
ответ дан 14 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: