【问题标题】:Incorrect result with islower when using ctypes使用 ctypes 时 islower 结果不正确
【发布时间】:2014-07-05 21:54:37
【问题描述】:
>>> 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 中的错误,还是我做错了什么?

【问题讨论】:

  • 在 C 中任何非零值都为真。所以 512 是一个很好的指标,表明 h 是小写的。在内部,ctypes 通常实现为一个位图表,每个字符一个。这必须使用第 9 位小写。
  • @Gene 我认为他在最后一个命令中询问False
  • 确实如此,但是当我用 c_bool 替换返回类型时,它返回 false
  • 可能 c_bool 被错误地声明为 char 所以 2^9 被强制转换为 c_bool 会丢失 1 位。
  • 建议删除C标签。

标签: python c ctypes


【解决方案1】:

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

这次你得到了一个不正确的结果(可能是因为在你的平台上,返回码进入了一个寄存器,所以它只占用了它的低 8 位),在另一个平台上或另一种类型上,这很容易破坏堆栈,从而使您的进程崩溃。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多