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

时间:2013-07-31 17:08:17

标签: python ctypes

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

1 个答案:

答案 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)