2011-09-19 17 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