Python中的ctypes c_char_p_array_64对象

2 投票
1 回答
517 浏览
提问于 2025-04-18 17:46

我正在尝试在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]

撰写回答