虽然已经阅读了一些关于类似主题的问题,但我无法弄清楚我的情况有什么意义......我在我的库标题中定义了如下的C结构:
#define CLT_MAX_SIZE 16
#define MSG_MAX_SIZE 512
typedef struct
{
LOG_LEVEL m_level;
char m_text[MSG_MAX_SIZE];
char m_client[CLT_MAX_SIZE];
} LOG_Msg;
在为这个库编写Python包装器时,我遇到了处理这种结构的麻烦:
class Message(Structure):
""" """
_fields_ = [
("m_level", c_int),
("m_text", c_char_p*MSG_MAX_SIZE),
("m_client", c_char_p*CLT_MAX_SIZE)
]
问题是我无法为此类编写正确的 init 方法。我想尊重以下原型:
def __init__(self, level, client, text):
""" """
self.m_level = c_int(level)
self.m_text = **???**
self.m_client = **???**
我尝试使用ctypes cast()和create_string_buffer()方法,但是还没有设法初始化这两个文本字段。一定是错过了某个地方的东西,但不知道Qo远......
欢迎任何提示;)
答案 0 :(得分:0)
你想要的是这个:
#!/usr/bin/python
from ctypes import *
class Message(Structure):
MSG_MAX_SIZE=128
CLT_MAX_SIZE=64
_fields_ = [
("m_level", c_int),
("m_text", type(create_string_buffer(MSG_MAX_SIZE))),
("m_client", type(create_string_buffer(CLT_MAX_SIZE)))
]
print Message.m_text
print Message.m_client
t = Message(100, 'abcdef' ,'flurp')
print t
print t.m_text
当你打印Message.m_text和Message.m_client时,你会发现它们是正确的类型:
<Field type=c_char_Array_128, ofs=4, size=128>
<Field type=c_char_Array_64, ofs=132, size=64>
但是您可以创建对象并将字段用作具有边界限制的普通Python字符串。