当我使用c_char
数组定义ctypes结构作为字段时,我无法获得该字段的大小,但如果我切换到c_ubyte
数组,我可以。我的理解是,在下面的示例中,Python将bar2
视为指针(char *),而不是bar1
。如果有人能解释其背后的逻辑,我会很感激。
import ctypes
class Foo(ctypes.Structure):
_fields_ = [ ('bar1', ctypes.c_ubyte*1),
('bar2', ctypes.c_char*1) ]
foo = Foo()
for f,t in foo._fields_:
print t
print ctypes.sizeof(foo.bar1)
print ctypes.sizeof(foo.bar2)
这是输出:
<class '__main__.c_ubyte_Array_1'>
<class '__main__.c_char_Array_1'>
1
Traceback (most recent call last):
File "test.py", line 12, in <module>
print ctypes.sizeof(foo.bar2)
TypeError: this type has no size
答案 0 :(得分:3)
foo.bar1
确实是一个1 ubyte的ctypes数组,但foo.bar2
是一个由数组中的内容组成的字符串,被视为以null结尾的C字符串。如果你制作更长的数组,比如长度为5,则更清楚:如果它们包含例如重复的字符“A”,那么foo.bar1
将读为
<__main__.c_ubyte_Array_5 object at 0xf7551df4>
而foo.bar2
将读为
"AAAAA"
这是一个普通的Python字符串。这是c_char
类型的特例。确实,这很烦人,因为首先没有干净的方法将这个值"AAAAA"
写入bar2
......