Python中的ctypes c_char_p_array_64对象
我正在尝试在Python中加载并调用DLL文件中的函数。以下是我代码的一部分:
listdyn= (ctypes.c_char_p * len(list1_))(*list1_)
print type(listdyn)
输出结果是:main.c_char_p_Array_64'
我需要对c_char_p(或者说字符串)进行位运算。
我有两个问题:
1) 这样做后,listdyn变成指向指针的指针了吗?
2) 我该如何转换成字符串或c_char_p?
1 个回答
0
2) 如何将其转换为字符串或 c_char_p
如果你的 list1_
里只有字符串值,可以用下面的代码把 listdyn
转换成字符串:
print ''.join([ctypes.cast(i, ctypes.c_char_p).value for i in listdyn])
或者简单地(正如 eryksun 正确指出的那样):
print ''.join(listdyn[:])
但问题是,list1_
里可能会有整数值。例如:
list1_ = ['Demo', '', 'string', 0, 'value', 123]
字符串对象的值('Demo'
、''
、'string'
和 value
)可以通过它们的地址找到,但整数值(0 和 123)会作为地址存储在 c_char_p_Array 中(0x00 和 0x7b = 123 的十六进制表示)。所以如果你尝试用以下代码获取第 5 个项目(123)的值:
print ctypes.cast(listdyn[5], ctypes.c_char_p).value
,在 Windows 上会出现以下错误:
ValueError: invalid string pointer 0x000000000000007B
而在 Linux 上则会出现段错误。
因此,如果 list1_
中有整数值,在 Windows 上可以尝试使用以下代码:
result_list = []
listdyn_addr = (ctypes.c_void_p * len(listdyn)).from_buffer(listdyn)
for i in xrange(0, len(listdyn)):
str_pointer = listdyn_addr[i]
try:
value = ctypes.c_char_p(str_pointer).value
if value == '':
result_list.append('')
else:
result_list.append(0 if not value else value)
except:
result_list.append(str_pointer)
print result_list
结果:
['Demo', '', 'string', 0, 'value', 123]