2

当我用数组作为字段定义 ctypes 结构时,c_char我无法获得该字段的大小,但如果我切换到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
4

1 回答 1

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

于 2013-01-27T18:32:44.493 回答