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)

そのため、キャスト操作はデータをコピーせず、配列の内容へのポインターを返すだけです。少し安全ではありませんが、ポインターを使用してインデックスを作成することもできます。

または、配列de novoを作成する場合は、次の手順を実行します。

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