如何将字节从ctypes结构复制到从create_string_buffer创建的缓冲区

Gab*_*abe 4 python ctypes

我有一个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)),所以似乎应该有一些方法可以轻松地做到这一点. .

Ery*_*Sun 5

避免使用进行临时复制的操作,或者在迭代时创建临时对象.这应该是从源缓冲区到目标缓冲区的直接复制.它最简单易用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)