1

虽然一直在阅读一些关于类似主题的问题,但我无法弄清楚我的情况有什么意义......我在我的库标题中定义了一个 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 远...

欢迎任何提示;)

4

1 回答 1

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 字符串。

于 2013-11-07T16:46:01.303 回答