我想弄清楚一些C代碼,以便我可以將它移植到python中。該代碼用於讀取專有的二進制數據文件格式。到目前爲止它已經很簡單 - 它主要是結構,我一直在使用struct
庫來從文件中請求特定的ctypes。然而,我只是想到了這一點的代碼,我不知道如何在python中實現它。特別是,我不知道如何處理enum
或union
。在Python中實現C的枚舉和聯合
#define BYTE char
#define UBYTE unsigned char
#define WORD short
#define UWORD unsigned short
typedef enum {
TEEG_EVENT_TAB1=1,
TEEG_EVENT_TAB2=2
} TEEG_TYPE;
typedef struct
{
TEEG_TYPE Teeg;
long Size;
union
{
void *Ptr; // Memory pointer
long Offset
};
} TEEG;
其次,在下面的結構定義,我不知道什麼是變量名後的冒號的意思是,(例如,KeyPad:4
)。這是否意味着我應該讀取4個字節?
typedef struct
{
UWORD StimType;
UBYTE KeyBoard;
UBYTE KeyPad:4;
UBYTE Accept:4;
long Offset;
} EVENT1;
在情況下,它是非常有用的,我一直在訪問在python文件的方式一個抽象的例子如下:
from struct import unpack, calcsize def get(ctype, size=1): """Reads and unpacks binary data into the desired ctype.""" if size == 1: size = '' else: size = str(size) chunk = file.read(calcsize(size + ctype)) return unpack(size + ctype, chunk)[0] file = open("file.bin", "rb") file.seek(1234) var1 = get('i') var2 = get('4l') var3 = get('10s')
因爲我真的不知道蟒蛇,我不能幫你那裏,但變量名後的冒號表示的howmany位用於存放它(所以keyPad和Accept共享一個字節,KeyPad位於前四位,Accept位於最後四位) – Grizzly 2010-09-28 16:37:37
在Python中不需要聯合,因爲它不使用嚴格的類型檢查。在你上面的例子中,你可以把這個地址綁定到一個對象上,並把一個長的地址綁定到同一個名字上。 – 2010-09-28 17:16:34
@Micael Mior。 Python __does__在運行時進行嚴格的類型檢查。儘管你可以將兩個不同的值綁定到同一個名字,但你永遠不可以讓它們擁有__共享同一個地址___這就是C中的union。 – aaronasterling 2010-09-28 17:47:03