Python 将c_字符强制转换为c_字符数组

Python 将c_字符强制转换为c_字符数组,python,ctypes,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)(f

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

你为什么不保留原来的食物

因此,cast操作不会复制数据,而只是返回一个指向数组内容的指针。您还可以通过指针建立索引,尽管这有点不安全

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

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

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

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

这只是一个例子。在我的实际代码中,我没有访问数组的权限,只有一个指针和长度这可能很旧,因为
\u get\u buffer\u value
似乎不存在。即使是这样,最初的下划线表明它是一个内部函数。这样更好。
foo_ = (c_char * 4).from_address(foo_ptr._get_buffer_value())

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