在python中实现C的枚举和联合

pea*_*lco 4 c python struct unions

我试图弄清楚一些C代码,以便我可以将它移植到python中.该代码用于读取专有的二进制数据文件格式.到目前为止它一直很简单 - 它主要是结构,我一直在使用struct库来从文件中请求特定的ctypes.但是,我刚刚提到了这段代码,我对如何在python中实现它感到茫然.特别是,我不知道如何处理enum或者union.

#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;
Run Code Online (Sandbox Code Playgroud)

其次,在下面的struct定义中,我不确定变量名后面的冒号是什么意思,(例如KeyPad:4).这是否意味着我应该读4个字节?

typedef struct
{
    UWORD StimType;
    UBYTE KeyBoard;
    UBYTE KeyPad:4;
    UBYTE Accept:4;
    long Offset;
} EVENT1;
Run Code Online (Sandbox Code Playgroud)

如果它有用,我在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')

小智 8

枚举:该语言中没有枚举.已经提出了各种习语,但没有一种真正普遍存在.最直接的(在这种情况下是足够的)解决方案是

TEEG_EVENT_TAB1 = 1
TEEG_EVENT_TAB2 = 2
Run Code Online (Sandbox Code Playgroud)

工会:ctypes工会.

fieldname : n语法被称为位域和,是啊,确实意味着"这是N位大".ctypes再次拥有它们.