2011-09-19 41 views
3

我移植一个简单​​的蓝牙应用程序,这将在L2CAP协议“魔术”分组到蓝牙设备..的Python等效C结构(移植的应用程序的形式C至蟒)

我有转换结构的一个问题对象在C蟒等效..

在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; 

,然后在应用它的使用这样的:

 /* set up */ 
    c.type = CFGBT_TYPE_GETREQ; 
    c.varid = strtol(argv[3], NULL, 0); 
    c.status = 0; 
    memset(c.value, 0, 16); 
    /* send frame */ 
    write(s, &c, sizeof(c)); 

你能指出我如何使用python构造相同的包/类结构的结构吗?

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

+0

你只是想要一个与你的结构体保持相同值的类,或者你想拥有相同的内存结构吗?如果你知道你有哪个目标,这可能会有所帮助。 – rocksportrocker

+0

我们不会为您编写代码。具体来说,你的问题是什么?你创建了一个'ctypes.Structure'的子类,你指定了这些字段,然后你''file_like_obj.write(yourobject)'填充了字段。 – agf

+0

@agf我需要发送与C应用程序完全相同的数据包“数据”,因为接收设备只会等待那种数据包。如果没有,就没有答案..我是,不是等待代码..但是看到struct exaples转换为Python将是很好的,在linkt在哪里可以找到答案.. – Michal

回答

3

你可以去了解它与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)。

0

如果您的目标是将一组键/值组合在一个对象中,则可以使用dictnamedtuple

一个字典将是:

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

访问:CFGBTFRAME [ '类型']

与namedtuple:

from collections import namedtuple 
CFGBTFRAME = namedtuple('CFGBTFRAME', ['type', 'status', ...]) 
c = CFGBTFRAME() 
c.type = myType 

看到http://docs.python.org/library/collections.html#collections.namedtuple约namedtuple更多信息。

+1

我的目标不是完全将数据分组到键/值对象..我只需要发送完全相同的数据包数据接收设备为te C应用程序确实....如果没有,将不会有答案.. – Michal