приведение в строку Python из char [], возвращаемого DLL - PullRequest
8 голосов
/ 16 января 2012

Я пытаюсь привести строковый указатель const char [] в стиле C (возвращаемый из DLL) в Python-совместимый строковый тип.но когда Python27 выполняет:

import ctypes

charPtr = ctypes.cast( "HiThere", ctypes.c_char_p )
print( "charPtr = ", charPtr )

, мы получаем: charPtr = c_char_p('HiThere')

, возможно, что-то не должно оцениваться должным образом.Мои вопросы:

  1. как преобразовать этот charPtr обратно в Python-совместимую, пригодную для печати строку?
  2. только что упомянутая операция приведения делает то, что должна делать?

Ответы [ 2 ]

10 голосов
/ 16 января 2012

ctypes.cast () используется для преобразования одного экземпляра ctype в другой тип данных ctype. Вам не нужно это преобразовывать в строку Python. Просто используйте ".value", чтобы получить его в строку Python.

>>> s = "Hello, World"
>>> c_s = c_char_p(s)
>>> print c_s
c_char_p('Hello, World')
>>> print c_s.value
Hello, World

Подробнее здесь

7 голосов
/ 16 января 2012

Если вы установите атрибуты argtypes или restype функций ctypes, они вернут нужный объект Python без необходимостиприведение.

Вот пример вызова функций C-runtime time и ctime:

>>> from ctypes import *
>>> m=CDLL('msvcrt')
>>> t=c_long(0)
>>> m.time(byref(t))
1326700130
>>> m.ctime(byref(t))  # restype not set
6952984
>>> m.ctime.restype=c_char_p  # set restype correctly
>>> m.ctime(byref(t))
'Sun Jan 15 23:48:50 2012\n'
...