Я должен передать массив переменной длины, в которой каждый элемент является кортежем двух целых чисел. Как пример:
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, но я, может казаться, не выясняю, как отправить эти более 'сложные' структуры по сети.
Слова благодарности для Вашей справки.
Взгляните на xdrlib , это может помочь. Это часть стандартной библиотеки и:
Модуль xdrlib поддерживает стандарт представления внешних данных, как описано в RFC 1014 , написанном Sun Microsystems, Inc., июнь 1987 г. Он поддерживает большинство типов данных. описано в RFC.
Несмотря на то, что вы можете использовать pack и unpack, я бы рекомендовал использовать что-то вроде YAML или JSON для передачи ваших данных.
JSON включен в стандартный дистрибутив Python начиная с версии 2.6. Для YAML есть PyYAML .
Вам нужен какой-то протокол сериализации. twisted.spread
предоставляет один из них (см. спецификацию Banana или документацию Perspective Broker ). Буферы протокола JSON или были бы более подробными примерами.
См. Также Сравнение форматов сериализации данных .
Если вы включите длину сообщения как часть сообщения, то вы будете знать, сколько данных нужно прочитать. Таким образом, вся строка должна быть прочитана по сети.
В любом случае, возможно, вам будет полезно опубликовать код, который вы используете для передачи данных по сети, или хотя бы дать более подробное описание.
Упаковка и распаковка обязательны? Если нет, то можно использовать JSON и YAML.
Не используйте pickle, потому что это небезопасно.