我有一个ctypes结构(例如):
from ctypes import *
class Foo(Structure):
_fields_ = [('f1',c_uint),
('f2',c_uint)]
我想将该结构的一个实例复制到一个从create_string_buffer创建的缓冲区中(它的大小比单个Foo实例所需的大)。
示例:
f = Foo()
f.f1=1; f.f2=2;
buf = create_string_buffer(100)
buf[0:sizeof(f)] = f
我知道你可以在文件对象的结构上读取和写入数据(即打开('bar','rb')。readinto(f)),所以似乎应该有一些方法可以轻松地做到这一点太...
答案 0 :(得分:5)
避免使用进行临时复制的操作,或者在迭代时创建临时对象。这应该是从源缓冲区到目标缓冲区的直接复制。最简单的方法是使用ctypes.memmove
:
f = Foo()
f.f1=1
f.f2=2
buf = (c_char * 100)()
memmove(buf, byref(f), sizeof(f))
或者使用使用from_buffer
创建的临时数组(不是副本):
memoryview(buf)[:sizeof(f)] = (c_char * sizeof(f)).from_buffer(f)
然而,后者在Python 3中不起作用。它应该可以工作,但memoryview
不支持ctypes使用的缓冲区格式代码。
如果你想要一个大小相同或更小的新数组,你可以使用数组类型的from_buffer_copy
方法(2.6 +):
buf = (c_char * sizeof(f)).from_buffer_copy(f)