7

我有一个 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

我知道你可以从文件对象的结构中读取和写入数据(即 open('bar','rb').readinto(f) ),所以似乎也应该有一些方法可以轻松地做到这一点。 .

4

1 回答 1

8

避免使用制作临时副本或在迭代时创建临时对象的操作。这应该是从源缓冲区直接复制到目标缓冲区。使用最简单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 中不起作用。它应该可以工作,但是 ctypes 使用的缓冲区格式代码不受memoryview.

如果你想要一个大小相同或更小的新数组,你可以使用数组类型的from_buffer_copy方法(2.6+):

buf = (c_char * sizeof(f)).from_buffer_copy(f)
于 2013-07-31T17:37:03.510 回答