将c_char_p转换为c_char数组

时间:2012-07-07 05:02:43

标签: python ctypes

我需要通过将其转换为数组

来访问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)

2 个答案:

答案 0 :(得分:5)

找到它

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

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

答案 1 :(得分:0)

为什么不保留原始 foo ?:

>>> 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)

因此,强制转换操作不会复制数据,而只返回指向数组内容的指针。你也可以通过指针编制索引,虽然这有点不太好。

或者,如果要创建阵列 de novo ,请执行以下操作:

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