为什么ctypes sizeof对结构中的c_ubyte * 1和c_char * 1有不同的看法?

时间:2013-01-27 11:30:37

标签: python ctypes

当我使用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

1 个答案:

答案 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 ......