Python 初始化结构体

标签 python structure ctypes

我有一 block 包含二进制数据的内存。 该 block 是使用 ctypes.create_string_buffer 创建的,因此数据是可变的,并且可以作为数组访问。

每32位由一对组成,一个20位无符号整数和一个12位无符号整数。

我想访问第n个元素对,并更改内存块中的值。

我有一个结构:

from ctypes import *
class Int(Structure):
    _fields_ = [("first",  c_uint, 20),
                ("second",  c_uint, 12)]

如何从我的数据填充结构? 是否有一个类似 C 的指针,我可以将其设置为指向我的数据的结构?

最佳答案

您可以通过将结构类型乘以其长度来创建 Int 的数组类型;这里我使用 5 作为示例,您可以使用任何您需要的长度:

IntArray5 = Int * 5
arr = IntArray5()

如果每次需要使用不同的长度,则无需命名类型,只需使用:

arr = (Int * 5)()

然后,最好将数组传递到将填充它的函数中,而不是将字符串缓冲区传递给 C 函数、读取该缓冲区并进行转换:

myfunc = libfoo.myfunc
myfunc(arr, len(arr))

现在您应该能够访问 arr 的元素:

print arr[0].first
print arr[0].second

但是,如果由于某种原因您无法将该数组直接传递给函数,而是需要获取现有字符串缓冲区并生成共享该缓冲区的 Int 数组,则您可以可以按照 eryksun 的建议使用 from_buffer:

arr = (Int * 5).from_buffer(buff)

或者,如果您想复制到新数组而不是共享底层缓冲区:

arr = (Int * 5).from_buffer_copy(buff)

关于Python 初始化结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061280/

相关文章:

c - 零元素数组需要什么?

python - 在 python 中对具有特定语言环境的字符串列表进行排序

python - 包含数组的 ctypes 结构

Python ctypes 函数指针

c - C 编程中未定义的函数引用

python - 说法1和说法2有什么区别吗

python - 用按钮填充 gtk.Dialog 窗口的操作区域 - 而不是让它们向右对齐

python - 记录 MongoEngine 生成的原始查询

python - 如何在 tensorflow 中将恢复的权重随机设置为零?

c++ - 访问类中的结构成员