Serializing a C struct in Python and sending over a socket(在Python中序列化C结构并通过套接字发送)
                            本文介绍了在Python中序列化C结构并通过套接字发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
                        
                        问题描述
我正在尝试序列化以下C结构
struct packet
{
    int id;
    unsigned char *ce;
    unsigned char *syms;
};
,并通过套接字发送它。ce和syms所指向的元素的数量已知为N。目前我就是这样做的。首先,我使用ctype将结构包装为
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个字节,我可能必须使用PICLE为每个结构发送近4000个字节。此外,打包/填充DataLoad也需要时间。
所以我的问题是,我有没有其他更好的选择来将这个C结构序列化为Python语言并发送?我更喜欢避免使用Pickle,并填充一个单独的类实例。谢谢。
推荐答案
最终我想出了以下方法来手动序列化`Packet‘实例,而不使用Pickle。
def serialize(pkt_p, size_g, size_p):
    """ Serialize Packet instance
        size_g - number of elements pointed by ce
        size_p - number of elements pointed by syms
        Return a byte stream
    """ 
    pktstr = b''
    pktstr += struct.pack('i', pkt_p.contents.id)
    pktstr += string_at(pkt_p.contents.ce, size_g)
    pktstr += string_at(pkt_p.contents.syms, size_p)
    return pktstr
def deserialize(pkt_p, pktstr, size_g, size_p):
    """ De-serialize pktstr and fill a POINTER(Packet)
    """
    pkt_p.contents.id = struct.unpack('i', pktstr[0:4])[0]
    ce = (c_ubyte * size_g).from_buffer_copy(pktstr[4:4+size_g])
    pkt_p.contents.ce = cast(ce, POINTER(c_ubyte))
    syms = (c_ubyte * size_p).from_buffer_copy(pktstr[-size_p:])
    pkt_p.contents.syms = cast(syms, POINTER(c_ubyte))
string_at()和from_buffer_copy()功能是关键。
这篇关于在Python中序列化C结构并通过套接字发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:在Python中序列化C结构并通过套接字发送
				
        
 
            
        
             猜你喜欢
        
	     - 使用公司代理使Python3.x Slack(松弛客户端) 2022-01-01
 - 我如何卸载 PyTorch? 2022-01-01
 - CTR 中的 AES 如何用于 Python 和 PyCrypto? 2022-01-01
 - 计算测试数量的Python单元测试 2022-01-01
 - ";find_element_by_name(';name';)";和&QOOT;FIND_ELEMENT(BY NAME,';NAME';)";之间有什么区别? 2022-01-01
 - 我如何透明地重定向一个Python导入? 2022-01-01
 - 检查具有纬度和经度的地理点是否在 shapefile 中 2022-01-01
 - 如何使用PYSPARK从Spark获得批次行 2022-01-01
 - YouTube API v3 返回截断的观看记录 2022-01-01
 - 使用 Cython 将 Python 链接到共享库 2022-01-01
 
