我有一 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/