python - 如何使用 Python 优雅地发送/接收大型 C 结构?

标签 python c sockets struct python-3.x

我已经开始编写 Python 3.x 客户端应用程序。服务器应用程序已经存在并且是用 C 语言编写的。服务器提供了一个 C 头文件,其中定义了两个用于通过 UDP 发送和接收数据的结构(我正在使用 Python 的 socket 模块)。 问题在于 C 结构体非常大(每个结构体大约有 200 个元素)。如果我使用 Python 的 struct 模块来打包/解包数据,一个不太优雅的解决方案是手动打包/解包 200 个元素,例如:

struct.pack('H...I', data1, ..., data200)

此外,我希望能够使用类似 C 的语法在 Python 中访问接收/发送的元素。例如,如果我在 C 服务器端做

send.data.pos = pos;

如果我可以像这样访问 Python 客户端中的 pos 变量,那就太好了(最自然):

pos = recv.data.pos

请注意,问题不是如何从头文件自动写入 Python 中的结构,如 this线程(我在 Python 中一个一个地编写每个结构字段没有问题),而是什么是在 Python 中组织数据的最佳方式(例如,在类中,使用字典等),这将使我能够利用 Python功能并使代码更简单,数据更易于访问(我宁愿只使用 Python 标准模块,不使用外部软件)。实现这一目标的最优雅方法是什么?

最佳答案

试试这个——适用于 2.7 和 3.2。

脚本:

import struct, collections

class CStruct(object):

    def __init__(self, typename, format_defn, lead_char="!"):
        self.names = []
        fmts = [lead_char]
        for line in format_defn.splitlines():
            name, fmt = line.split()
            self.names.append(name)
            fmts.append(fmt)
        self.formatstr = ''.join(fmts)
        self.struct = struct.Struct(self.formatstr)
        self.named_tuple_class = collections.namedtuple(typename, self.names)

    def object_from_bytes(self, byte_str):
        atuple = self.struct.unpack(byte_str)
        return self.named_tuple_class._make(atuple)

if __name__ == "__main__":
    # do this once
    pkt_def = """\
        u1 B
        u2 H
        u4 I"""
    cs = CStruct("Packet1", pkt_def)
    # do this once per incoming packet
    o = cs.object_from_bytes(b"\xF1\x00\xF2\x00\x00\x00\xF4")
    print(o)
    print(o.u4)

输出:

Packet1(u1=241, u2=242, u4=244)
244

关于python - 如何使用 Python 优雅地发送/接收大型 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6037555/

相关文章:

c# - 如何使用套接字通过 Internet 发送数据?

Python Pandas Concat 具有不同列和相同行的数据框列表

python '' .format() : "tuple index out of range"?

python - Big Query流缓冲区插入空行python

c - 在结构错误中指向取消引用(间接需要指针操作数)

c - 如何在 linux 内核上进行 64 位除法?

Python PEP8 : Blank lines convention

c - 限制在程序集文件中使用 #define'd 函数/内联函数

java - 如何测量丢弃的UDP消息数?

c - 同步读写