初始化ctypes字符串对象

时间:2013-11-07 15:26:56

标签: python casting ctypes

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

欢迎任何提示;)

1 个答案:

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