C结构的Python等价物(将app form C移植到Python)

2024-09-30 01:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在移植一个简单的蓝牙应用程序,它通过L2Cap协议向蓝牙设备发送“魔力”数据包。。在

我在将C语言中的struct对象转换为python等效对象时遇到了一个问题。。在

在c中:

/* command types */
#define CFGBT_TYPE_SETREQ           0x00
#define CFGBT_TYPE_SETRES           0x01
#define CFGBT_TYPE_GETREQ           0x02
#define CFGBT_TYPE_GETRES           0x03

/* varid types */
#define CFG_VARIDT_UINT16                   0x0000
#define CFG_VARIDT_UINT32                   0x1000
#define CFG_VARIDT_STRING16                 0x2000

typedef struct {
    uint8_t      type, status;
    uint16_t     varid;
    uint8_t      value[16];
} __attribute__((packed)) CFGBTFRAME;

static CFGBTFRAME c;

然后在应用程序中是这样使用的:

^{pr2}$

你能告诉我如何使用python构造同样的包/结构吗?在

我知道我可能需要使用ctypes并创建“empty”类,但是如何将这些结合起来呢?在


Tags: 对象应用程序协议typecfgstructtypes魔力
2条回答

您可以使用struct模块将值打包为字节字符串,例如:

>>> import struct
>>> type, status, varid, value = 1, 0, 16, b'Hello'
>>> buffer = struct.pack('>BBH16s', type, status, varid, value)
>>> buffer
b'\x01\x00\x00\x10Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

或者,您可以使用ctypes.Structure来定义一个将代表您的结构的类。它的优点是更容易与Python代码一起使用,但是您必须考虑对齐和填充问题,并自己解决它们(可能使用struct)。在

如果您的目标是对一个对象中的一组键/值进行分组,那么可以使用dict或{}。在

一句话应该是:

CFGBTFRAME = {
    'type' : myType,
    'status' : ...
}

访问:CFGBTFRAME['type']

使用namedtuple:

^{pr2}$

有关namedtuple的详细信息,请参见http://docs.python.org/library/collections.html#collections.namedtuple。在

相关问题 更多 >

    热门问题