将c_char数组类型别名为通用缓冲区或其他ctypes类型

时间:2014-05-01 18:45:39

标签: python ctypes python-2.6

我正在尝试将c_char数组类型别名为通用缓冲区或其他ctypes类型。但自动转换为str似乎阻止了我。我已经成功地使用其他类型完成了这类事情,但不是c_char数组。

我无法想到或seems to be listed in the docs似乎可以自动转换为str。我已尝试byrefaddressoffrom_buffer_copyfrom_paramcast - 但他们都没有认为.attributename是ctypes类型。他们都将其视为str

如果有offsetof函数,我想我可能会勉强从Foo实例的基础走到'bar'字段。但我所知道的并不存在。

from ctypes import *

baz_t = c_int * 3
bar_t = c_char * 12
assert(sizeof(baz_t) == sizeof(bar_t))
class Foo(Structure):
    _fields_ = [
            ('hdr', c_int),
            ('bar', bar_t),
            ]

f = Foo(1, '11\x0034')
try:
    fbar_p = addressof(f.bar)
#   ...
except Exception as e:
    print e
try:
    bar = bar_t.from_param(f.bar)
except Exception as e:
    print e

try:
    bar = bar_t.from_buffer_copy(f.bar)
except Exception as e:
    print e

生成此输出:

$ ./sampl.py
invalid type
expected c_char_Array_12 instance instead of str
Buffer size too small (2 instead of at least 12 bytes)

我不想使用cffi,我宁愿避免创建另一个Foo - 就像Structure一样,为了整个shebang的别名 - 应该有一个更简单的方法,对吗?

在现实生活中,结构是由ctypesgen从第三方头文件创建的。所以我不能只创建一个Union

0 个答案:

没有答案