我有可以使用的代码,但是我不知道为什么。
str2payload = lib3.str2payload
str2payload.argtypes = [POINTER(mbuf_t), POINTER(c_char)]
# sbuf = ..
val = b"asdfasdfasdhfjkasgdfjasgdfhjasgdfjhasgdfjhasgdfgjh"
rmr_str2payload(sbuf, val)
这按预期工作。在这里,val只是python中的bytes对象。但是,函数签名说它应该是POINTER(c_char)
。那么神奇的转换是什么呢?
顺便说一句,我使用POINTER(c_char)
的原因是因为它在这里说:https://docs.python.org/3.7/library/ctypes.html#ctypes.c_char_p
答案 0 :(得分:1)
调用外部函数时,每个实际参数都传递给argtypes元组中各项的from_param()类方法,该方法允许将实际参数调整为外部函数接受的对象。例如,argtypes元组中的c_char_p项将使用ctypes转换规则将作为参数传递的unicode字符串转换为字节字符串。
新增:现在可以将项目放入不是ctypes类型的argtype中,但是每个项目必须具有from_param()方法,该方法返回可用作参数的值(整数,字符串,ctypes实例)。这样就可以定义可以将自定义对象用作功能参数的适配器。