2

我需要通过将 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)
4

2 回答 2

5

找到了

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

print foo_.raw # => 'foo\x00'
于 2012-07-07T05:29:46.210 回答
1

你为什么不保留原来的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)

所以强制转换操作不会复制数据,而只是返回指向数组内容的指针。您也可以通过指针进行索引,尽管这有点不安全。

或者,如果要从头创建数组,请执行以下操作:

>>> array_type = (c_char * 4 )
>>> foo = array_type.from_address( foo_ptr )
>>> foo.value
'abc'
于 2012-07-07T05:28:40.017 回答