Python 如何将字节从ctypes结构复制到从create\u string\u buffer创建的缓冲区
我有一个ctypes结构(例如): 我想将该结构的一个实例复制到从create_string_buffer创建的缓冲区中(该缓冲区的大小大于Foo的单个实例所需的大小) 例如:Python 如何将字节从ctypes结构复制到从create\u string\u buffer创建的缓冲区,python,ctypes,Python,Ctypes,我有一个ctypes结构(例如): 我想将该结构的一个实例复制到从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))的结构上读写数据,因此似乎也应该有一些方法可以轻松做到这一点…避免使用生成临时
f = Foo()
f.f1=1; f.f2=2;
buf = create_string_buffer(100)
buf[0:sizeof(f)] = f
我知道您可以在文件对象(即open('bar','rb').readinto(f))的结构上读写数据,因此似乎也应该有一些方法可以轻松做到这一点…避免使用生成临时副本或在迭代时创建临时对象的操作。这应该是从源缓冲区到目标缓冲区的直接拷贝。使用
ctypes最简单。memmove
:
f = Foo()
f.f1=1
f.f2=2
buf = (c_char * 100)()
memmove(buf, byref(f), sizeof(f))
或者使用从缓冲区创建的临时数组(不是副本):
但是,后者在Python3中不起作用。它应该可以工作,但ctypes使用的缓冲区格式代码不受memoryview
支持
如果您想要一个大小相同或更小的新数组,可以使用数组类型的from\u buffer\u copy
方法(2.6+):
如果我想反过来做呢?将缓冲区复制到具有大小和数据的ctype结构中。@marsh,使用
memmove
将数据复制到现有结构中,但如果要创建新实例,请尝试使用from\u buffer\u copy
构造函数。您可以使用memoryview(buf).cast('B')
放弃不需要的格式代码。
f = Foo()
f.f1=1
f.f2=2
buf = (c_char * 100)()
memmove(buf, byref(f), sizeof(f))
memoryview(buf)[:sizeof(f)] = (c_char * sizeof(f)).from_buffer(f)
buf = (c_char * sizeof(f)).from_buffer_copy(f)