【发布时间】:2016-04-04 15:46:34
【问题描述】:
我正在尝试序列化以下 C 结构
struct packet
{
int id;
unsigned char *ce;
unsigned char *syms;
};
在 Python 中并通过套接字发送。 ce 和 syms 指向的元素的数量已知为 N。目前我正在这样做。首先,我使用 ctypes 将结构包装到
class Packet(Structure):
_fields_ = [("id", c_int),
("ce", POINTER(c_ubyte)),
("syms", POINTER(c_ubyte))]
然后,我使用来自ctypes.POINTER(Packet) 的fill_data 函数填充以下类的对象:
class DataLoad:
def __init__(self):
self.id = -1
self.ce = []
self.syms = []
def fill_data(self, pkt_p):
""" pkt_p is POINTER(Packet)
"""
self.id = pkt_p.contents.id
self.ce = []
for i in range(N):
self.ce.append(pkt_p.contents.ce[i])
self.syms = []
for i in range(N):
self.syms.append(pkt_p.contents.syms[i])
最后,我只是简单地使用pickle.dumps(DataLoad) 生成一个字节流并发送。
这种方法效果很好。但是,它似乎很慢。我能看到的一个原因是pickle.dumps 带来了很多开销。例如,如果 C 结构只有 1024 个字节,我可能必须使用 pickle 为每个结构发送近 4000 个字节。此外,打包/填充 DataLoad 也需要时间。
所以我的问题是,我还有其他更好的选择来在 python 中序列化这个 C 结构并发送吗?我宁愿避免泡菜并填充一个单独的类实例。谢谢。
【问题讨论】:
-
在 c 中执行并使用 cython?
标签: python c sockets serialization ctypes