【发布时间】:2011-08-10 17:55:28
【问题描述】:
自从我阅读了 Dave Beazley 关于二进制 I/O 处理的帖子 (http://dabeaz.blogspot.com/2009/08/python-binary-io-handling.html) 后,我就一直想创建一个 Python 库对于某个有线协议。但是,我找不到可变长度结构的最佳解决方案。这是我想做的:
import ctypes as c
class Point(c.Structure):
_fields_ = [
('x',c.c_double),
('y',c.c_double),
('z',c.c_double)
]
class Points(c.Structure):
_fields_ = [
('num_points', c.c_uint32),
('points', Point*num_points) # num_points not yet defined!
]
Points 类将无法工作,因为尚未定义 num_points。一旦知道num_points,我可以稍后重新定义_fields_ 变量,但由于它是一个类变量,它会影响所有其他Points 实例。
这个问题的pythonic解决方案是什么?
【问题讨论】:
-
为什么需要结构?你不能只发送缓冲区吗?
-
我能问一下 C
struct是什么样的吗?我假设struct { size_t num_points; Point poits[]; }但我可能错了(尤其是如果您的 C 代码使用 C99 之前的 hack 来实现灵活的数组成员行为)。 -
没有一个等效的 C 结构体。需要建立一个缓冲区然后发送它。
-
@ChrisLutz 给出的结构定义实际上可以工作,只要你通过 malloc(sizeof(struct 不管)+bytes_used_by_array) 创建了一个指向它的指针。
标签: python python-3.x ctypes