2012-07-07 50 views
1

我需要它轉換爲數組鑄造一個c_char_p到c_char陣列

這裏訪問一個char *的內容是一個演示:

from ctypes import * 

foo = (c_char * 4)() 
foo.value = "foo" 
print foo.raw # => 'foo\x00' 
foo_ptr = cast(foo, c_char_p) 
print foo_ptr.value # => 'foo' 

現在我想foo​​_ptr轉換回(c_char * 4)。無論這些工作

foo_ = (c_char * 4)(foo_ptr) 
foo_ = cast(foo_ptr, c_char * 4) 

回答

0

你爲什麼不保留原有的

>>> foo = (c_char * 4)() 
>>> foo_ptr_1 = ct.cast(foo, ct.c_char_p) 
>>> foo_ptr_1 
c_char_p(28211760) 
>>> foo_ptr_2 = ct.cast(foo, ct.c_char_p) 
>>> foo_ptr_2 
c_char_p(28211760) 

所以轉換操作不會複製數據,而只是返回一個指向數組的內容。你也可以通過指針索引,雖然這有點不安全。

另外,如果你想創建數組從頭,請執行下列操作:

>>> array_type = (c_char * 4) 
>>> foo = array_type.from_address(foo_ptr) 
>>> foo.value 
'abc' 
+0

這只是一個例子。在我的實際代碼中,我無法訪問數組,只是一個指針和長度 – chriso 2012-07-07 05:30:23

+0

好的,現在看看你的觀點。 – dsign 2012-07-07 05:47:42

4

發現

foo_ = (c_char * 4).from_address(foo_ptr._get_buffer_value()) 

print foo_.raw # => 'foo\x00' 
+0

由於'_get_buffer_value'似乎不存在,這可能會比較老。即使是這樣,最初的下劃線表明它是一個內部函數。 [這個答案](http://stackoverflow.com/a/9784508/912144)更好。 – Shahbaz 2015-03-27 15:34:30