>>> from ctypes import *
>>> import ctypes.util
>>> libc = CDLL("libc.so.6")
>>> libc.printf("%c\n", 104)
h
2
>>> libc.islower(104) # Works fine
512
>>> libc.islower.restype = c_bool # But when i do this...
>>> libc.islower(104)
False
>>> c_bool(512)
c_bool(True)

就个人而言,我认为'h'是小写..

这是 ctypes 中的错误,还是我做错了什么?

最佳答案

restype 不仅仅是告诉 Python 输出类型,而且最重要的是,告诉我们期望的 C 类型是什么,以及如何编码它。 islower 返回一个 int ,通常为 4 字节宽;如果你说它返回一个 bool(通常是 1 个字节),你就违反了编码(marshal)代码的期望。

这次你得到了一个错误的结果(可能是因为在你的平台上返回码放在一个寄存器中,所以它只取它的低 8 位),在另一个平台或另一种类型上这很容易破坏堆栈,因此使您的进程崩溃。

所以:不要那样做。始终尊重 C API 类型并在调用后进行转换。

关于python - 使用 ctypes 时 islower 结果不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24590878/

10-12 06:07