使用Python的ctypes的意外行为

时间:2018-04-16 22:13:23

标签: python-3.x ctypes

我在使用Python的ctypes时发现了一些奇怪的行为。很明显,我误解了一些概念而且我无法将其固定下来。

代码:

from ctypes import *

class dnpControlPacket(Structure):
    _pack_ = 1
    _fields_ = [
            ("dir", c_bool),
            ("prm", c_bool),
            ("fcb", c_bool),
            ("fcv", c_bool),
            ("fc0", c_bool),
            ("fc1", c_bool),
            ("fc2", c_bool),
            ("fc3", c_bool)
            ]

class ctrlUnion(Union):
    _pack_ = 1
    _fields_ = [
            ("data", dnpControlPacket),
            ("bits", c_bool * 8),
            ("bytes", c_uint8 * 1)
            ]

ctrl = dnpControlPacket(1,1,0,0,0,0,0,0)
cu = ctrlUnion(ctrl)
print("bit format: %s" % [x for x in cu.bits])
print("byte format: %d" % cu.bytes[0])

我的目标是使用Union(cu)以字节形式读取数据。奇怪的是,字节的值是1,而各个位是'11000000'。我希望字节的值为192?即。

int('11000000', 2)

有人可以帮我看看我出错的地方吗?

1 个答案:

答案 0 :(得分:4)

ctypes c_bool由C _Bool数据类型实现(自C99起为a.k.a bool)。它占用最小的可寻址空间,通常为1个字节,与unsigned char非常相似。不同之处在于编译器将任何非零赋值转换为1。如果您想要命名位,ctypes中最接近的是Bit field