python连接ctype结构和数组

时间:2015-01-23 17:35:09

标签: python arrays concatenation ctypes

我正在尝试实现自定义UDP协议。该协议有标题和数据。标题包含有关数据结构的信息。

标题使用ctypes结构定义,数据使用' h'数组(签名简称)。

我正在使用python套接字。

我尝试使用单独调用" socket.sendto"来发送标头和数据。像这样:

s.sendto(header, addr)
s.sendto(data, addr)

但我无法将其作为连续流接收。 " socket.recvfrom"只是获取标题。也许如果我打电话给" socket.recvfrom"我也将获得数据。但这不是我需要的。我需要完整的数据包作为流。我认为连接服务器本身的头和数据可能会解决这个问题。

所以我尝试了以下不同的组合来连接两者:

  • 将标题转换为" c_char_p"阵列。
  • 将数据转换为bytearray
  • 使用numpy.concatenate
  • 将标题转换为' B'之后的标准数组连接阵列。
  • 将标题转换为' h'阵列。 (这与"字符串长度不是项目大小的倍数"
  • 失败

以上所有因上述原因而失败。

如果我需要转换标题或数据,我希望它是标题,因为它更小。但如果没有办法,我可以转换数据。

感谢任何帮助。

相关代码段:

sdata = array("h")
.
.
.
header=protocol.HEADER(1,50,1,50,1,50,1,50,1,10,1,12,1,1,1,1,1,18,19,10,35,60,85,24,25)
.
.
s.sendto(header+sdata, addr)

1 个答案:

答案 0 :(得分:1)

您可以将标头结构复制到ctypes字节数组中:

>>> buf = (ctypes.c_char * ctypes.sizeof(header)).from_buffer_copy(header)

现在,在Python 2中,

>>> buf.raw + sdata.tostring()

应该给你你想要的东西。

在Python 3中,它将是

>>> buf.raw + sdata.tobytes()