如何用Python ctypes读取以NUL结尾的NUL终止字符串数组(以Ghostscript的gs_error_names为例)
如何用Python ctypes读取以NUL结尾的NUL终止字符串数组(以Ghostscript的gs_error_names为例)
嘿,这个场景我之前处理过,其实核心思路就是遍历数组直到遇到NULL(空指针)为止,毕竟这类以NUL结尾的数组,最后都会用一个空指针来标记结束。咱们结合你已经掌握的内容,一步步实现:
首先,先回顾下你已经写的代码——你已经能成功加载Ghostscript库,并且能获取单个字符串或者固定数量的数组元素,这已经打好基础了。接下来要做的就是自动遍历到数组末尾。
解决方案代码
这里有个简洁的实现方式,直接把gs_error_names当成指向字符串指针的数组来处理,然后循环读取直到遇到空指针:
from ctypes import * from ctypes.util import find_library # 加载Ghostscript动态库 gs = CDLL(find_library("gs")) # 将gs_error_names声明为指向char*的指针(对应C语言里的char**类型) error_names_array = POINTER(c_char_p).in_dll(gs, "gs_error_names") # 用来存储所有读取到的错误名称 error_names = [] index = 0 while True: # 逐个获取数组中的字符串指针 current_str_ptr = error_names_array[index] # 遇到空指针(NULL)就终止循环 if current_str_ptr is None: break # 将C风格的字节串解码为Python字符串(编码可根据实际情况调整,比如latin-1) error_names.append(current_str_ptr.decode("utf-8")) index += 1 # 打印结果看看 for name in error_names: print(name)
为什么这样可行?
gs_error_names在C语言里是char**类型,也就是一个存储字符串指针的数组,最后以NULL(空指针)结尾。- 用
POINTER(c_char_p)来适配这个类型,就可以通过索引直接访问数组里的每个字符串指针。 - 当指针的值为
None时,就说明已经到了数组的末尾,这时候停止遍历就行。
补充说明
- 关于编码:如果Ghostscript的错误名称用的不是UTF-8编码,可以调整
decode的参数(比如换成latin-1),根据实际情况适配。 - 如果你想用更底层的内存地址操作方式,也可以通过计算指针偏移来遍历,但上面的方式已经足够简洁易读了。
备注:内容来源于stack exchange,提问作者mara004
相关产品推荐
相关产品推荐

