Python初始化Struct

时间:2015-03-15 13:42:08

标签: python structure ctypes

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

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

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

我有一个结构:

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

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

1 个答案:

答案 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)
相关问题