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