2013-07-31 58 views
4

創建我有(例如)一個ctypes結構的緩衝區:如何從一個ctypes結構複製字節從create_string_buffer

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 

我知道你可以閱讀並從文件對象的結構數據寫入/(即開放( '酒吧', 'RB')readinto(F)),如此看來也應該有一些方法可以輕鬆地做到這一點...

回答

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,但是。它應該可以工作,但是ctypes使用的緩衝區格式代碼不受memoryview的支持。

如果你想要一個新的陣列,這是相同的尺寸或更小,你可以使用數組類型的from_buffer_copy方法(2.6+):

buf = (c_char * sizeof(f)).from_buffer_copy(f) 
+0

如果我想周圍的人用另一種方式是什麼?將緩衝區轉換爲具有大小和數據的ctype結構。 – marsh

+1

@marsh,使用'memmove'將數據複製到現有的結構中,但是如果您要創建新實例,請改爲使用'from_buffer_copy'構造函數。 – eryksun

相關問題