我试图找出一些C代码,以便将其移植到python中。该代码用于读取专有的二进制数据文件格式。到目前为止,它很简单——主要是结构,我一直在使用struct
库从文件中请求特定的ctype。然而,我刚刚想到了这段代码,对于如何在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;
其次,在下面的结构定义中,我不确定变量名后面的冒号是什么意思(例如,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')
你真正需要知道的是:
ctypes
模块。对于您正在做的事情,使用它可能比使用struct
模块更容易。特别是,它可以处理通过C到达的指针ctypes
的原因;这个模块有执行必要的转换的函数。枚举:语言中没有枚举。人们提出了各种各样的习语,但没有一个是真正广泛使用的。最直接的(在本例中是充分的)解决方案是
联合体:ctypes具有unions。
fieldname : n
语法称为位字段,是的,它的意思是“这是n位大”。同样,ctypes有them。我不知道您所有问题的答案,但是对于不需要按值查找的枚举(即,只是使用它来避免幻数),我喜欢使用一个小类。常规的dict是另一个工作正常的选项。如果需要按值查找,则可能需要其他结构。
相关问题 更多 >
编程相关推荐