Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字节从ctypes结构复制到从create\u string\u buffer创建的缓冲区_Python_Ctypes - Fatal编程技术网

Python 如何将字节从ctypes结构复制到从create\u string\u buffer创建的缓冲区

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))的结构上读写数据,因此似乎也应该有一些方法可以轻松做到这一点…避免使用生成临时

我有一个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))的结构上读写数据,因此似乎也应该有一些方法可以轻松做到这一点…

避免使用生成临时副本或在迭代时创建临时对象的操作。这应该是从源缓冲区到目标缓冲区的直接拷贝。使用
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)