我正在尝试将c_char
数组类型别名为通用缓冲区或其他ctypes
类型。但自动转换为str
似乎阻止了我。我已经成功地使用其他类型完成了这类事情,但不是c_char
数组。
我无法想到或seems to be listed in the docs似乎可以自动转换为str
。我已尝试byref
,addressof
,from_buffer_copy
,from_param
,cast
- 但他们都没有认为.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
。