用python实现C的枚举与联合

2024-04-28 06:48:57 发布

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

我试图找出一些C代码,以便将其移植到python中。该代码用于读取专有的二进制数据文件格式。到目前为止,它很简单——主要是结构,我一直在使用struct库从文件中请求特定的ctype。然而,我刚刚想到了这段代码,对于如何在python中实现它,我不知所措。尤其是,我不知道如何处理enumunion

#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')


Tags: 代码sizegetenumctype结构structlong
3条回答

你真正需要知道的是:

  1. What is the size of an enum?。您将使用此答案生成解包代码。
  2. What is the size of a union?。摘要:最大成员的大小。
  3. 你怎么处理那个指针?您应该看看ctypes模块。对于您正在做的事情,使用它可能比使用struct模块更容易。特别是,它可以处理通过C到达的指针
  4. 如何在python中强制/强制转换从结构读取的数据为正确的类型?这就是我在上面的项目符号中推荐ctypes的原因;这个模块有执行必要的转换的函数。

枚举:语言中没有枚举。人们提出了各种各样的习语,但没有一个是真正广泛使用的。最直接的(在本例中是充分的)解决方案是

TEEG_EVENT_TAB1 = 1
TEEG_EVENT_TAB2 = 2

联合体:ctypes具有unions

fieldname : n语法称为位字段,是的,它的意思是“这是n位大”。同样,ctypes有them

我不知道您所有问题的答案,但是对于不需要按值查找的枚举(即,只是使用它来避免幻数),我喜欢使用一个小类。常规的dict是另一个工作正常的选项。如果需要按值查找,则可能需要其他结构。

class TeegType(object):
    TEEG_EVENT_TAB1 = 1
    TEEG_EVENT_TAB2 = 2

print TeegType.TEEG_EVENT_TAB1

相关问题 更多 >