gpt4 book ai didi

python - 为什么 ctypes sizeof 以不同的方式对待结构中的 c_ubyte*1 和 c_char*1?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:55 26 4
gpt4 key购买 nike

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

最佳答案

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

关于python - 为什么 ctypes sizeof 以不同的方式对待结构中的 c_ubyte*1 和 c_char*1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com