我有一块带二进制数据的内存块。
该块是使用ctypes.create_string_buffer
创建的,因此数据是可变的,可以作为数组访问。
每个32位由一对,一个20位无符号整数和一个12位无符号整数组成。
我想访问第n个元素对,并更改内存块中的值。
我有一个结构:
from ctypes import *
class Int(Structure):
_fields_ = [("first", c_uint, 20),
("second", c_uint, 12)]
如何从数据中填充结构? 是否有一个类似C的指针我可以设置为在我的数据中指向结构?
答案 0 :(得分:2)
您可以通过将结构类型乘以其长度来创建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
数组,那么你可以使用from_buffer
作为eryksun建议:
arr = (Int * 5).from_buffer(buff)
或者,如果您想复制到新数组而不是共享底层缓冲区:
arr = (Int * 5).from_buffer_copy(buff)