我在使用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)
有人可以帮我看看我出错的地方吗?
答案 0 :(得分:4)
ctypes
c_bool
由C _Bool
数据类型实现(自C99起为a.k.a bool
)。它占用最小的可寻址空间,通常为1个字节,与unsigned char
非常相似。不同之处在于编译器将任何非零赋值转换为1。如果您想要命名位,ctypes
中最接近的是Bit field