gpt4 book ai didi

python - Ctypes:获取指向结构体字段的指针

转载 作者:行者123 更新时间:2023-12-01 01:53:06 48 4
gpt4 key购买 nike

我需要获取一个带有结构体字段地址的指针。重要提示:我正在为一组 C 结构构建序列化器,因此我想迭代结构的字段并获取每个结构的地址作为指针。我知道有一种方法使用 fields 对象和它们的 offset 属性,它可以为您提供距结构本身地址的偏移量,但它是一个通用指针。您能否向我展示一种如何迭代结构字段并为每个字段获取具有正确内部类型的 ctypes 指针的方法?

最佳答案

这里有一个方法...

类变量Test._fields_定义属性及其C类型。通过分配字段生成的类属性包含有关该属性的偏移量的信息,例如:

>>> Test.a
<Field type=c_long, ofs=0, size=4>
>>> Test.b
<Field type=c_double, ofs=8, size=8>
>>> Test.c
<Field type=c_char_Array_10, ofs=16, size=10>

对于每种类型,from_buffer() 方法使用与现有类型相同的数据缓冲区构建 C 类型。该结构的实例实现了访问其数据所需的缓冲区 API,因此如果您知道结构元素数据的偏移量,则可以生成引用相同数据的 ctypes 类型,并创建一个指针到它。

from ctypes import *

class Test(Structure):
_fields_ = [('a',c_int),
('b',c_double),
('c',c_char * 10)]

x = Test(1,2.5,b'abc')

for field,ftype in Test._fields_:

# Look up each attribute in the class, and get its offset.
ofs = getattr(Test,field).offset

# Create a pointer to the same field type using the same data.
p = pointer(ftype.from_buffer(x,ofs))
print(p,p.contents)

输出:

<__main__.LP_c_long object at 0x000001932DE0EEC8> c_long(1)
<__main__.LP_c_double object at 0x000001932DE0ECC8> c_double(2.5)
<__main__.LP_c_char_Array_10 object at 0x000001932DE0EDC8> <__main__.c_char_Array_10 object at 0x000001932DE0ECC8>

关于python - Ctypes:获取指向结构体字段的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531131/

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