5

我需要传输一个不同长度的数组,其中每个元素都是两个整数的元组。举个例子:

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 = pack("hhhh",p.direction[0],p.direction[1],p.id,p.health)

在接收端:

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

第一个是为了说明,因为我试图发送格式“hhhhs”,但无论哪种方式,路径都不能正确通过。

谢谢您的帮助。我还将研究发送一个二维整数数组,但我似乎无法弄清楚如何通过网络发送这些更“复杂”的结构。

谢谢您的帮助。

4

5 回答 5

7

虽然您可以使用打包和解包,但我建议您使用YAMLJSON之类的东西来传输数据。

  • 如果您更改界面并且有不同的版本尝试相互通信,则打包和解包可能会导致难以调试的错误和不兼容性。
  • Pickle 可能会带来安全问题,并且 pickle 格式可能会在 Python 版本之间发生变化。

JSON 从 2.6 开始包含在标准 Python 发行版中。对于 YAML,有PyYAML

于 2010-03-27T20:53:43.153 回答
1

您需要某种序列化协议。 twisted.spread提供了一种(参见Banana 规范Perspective Broker 文档)。JSON 或协议缓冲区将是更详细的示例。

另请参阅数据序列化格式的比较

于 2010-03-27T20:57:03.727 回答
0

如果您在消息中包含消息长度,那么您将知道要读取多少数据。所以应该通过网络读取整个字符串。

无论如何,如果您发布一些用于通过网络发送数据的代码,或者至少提供更多描述,也许会有所帮助。

于 2010-03-27T20:51:03.923 回答
0

打包和拆包是强制性的吗?如果没有,您可以使用JSONYAML

不要使用泡菜,因为它不安全。

于 2010-03-27T20:52:04.517 回答
0

看看xdrlib,它可能会有所帮助。它是标准库的一部分,并且:

xdrlib 模块支持RFC 1014中描述的外部数据表示标准,该标准由 Sun Microsystems, Inc. 于 1987 年 6 月编写。它支持 RFC 中描述的大多数数据类型。

于 2010-03-27T21:26:04.600 回答