我正在研究一些ctype结构,发现一些有趣的东西使我对自己的实现感到疑惑。 MWE如下:
from ctypes import *
import numpy as np
class test_bitfield(Structure):
_fields_ = [("x", c_uint16, 9),
("y", c_uint8, 5),
("z", c_uint16, 4)]
bf = test_bitfield(np.uint64(9), np.uint64(9), np.uint64(9))
print(bf.x, ", ", bf.y, ", ", bf.z)
其输出是:
9,0,9
这是我没想到的。
通过将bf.y
变成c_uint16
,我从一开始就得到了期望:9, 9, 9
。
浏览文档后,我看到bitfields are only possible for integer fields,它并没有真正表明不支持c_uint8
。然后,我参考了可用的tests,在其中看到不包含c_uint8
或c_char
。但是,尝试使用c_char
会引发TypeError,而c_uint8不会引发。
有人可以澄清发生了什么吗?是否只为uint_8
未实现位字段?还是我使用错了?任何澄清都是高度赞赏!
谢谢!
答案 0 :(得分:0)
注意:Mac OS X python 2.7和3.6具有相同的输出
所以...由于某种原因,您不能使用带符号或无符号的8位类型,并用位域将它们分开...我将在文档中查找“为什么”
dfo = df({'Issue Type':['Lessons Learnt','Other Control Issues']},
{'Status':['Open','Open - Actions Completed']})
输出:from ctypes import *
class test_bitfield(Structure):
_fields_ = [("x", c_uint16, 9),
("y", c_uint16, 6),
("z", c_uint16, 4)]
bf = test_bitfield(1,255,3)
print(bf.x, ", ", bf.y, ", ", bf.z)
很酷,删除了前2位:(1, ', ', 63, ', ', 3)
和
255 - 128 - 64 = 63
打印:from ctypes import *
class test_bitfield(Structure):
_fields_ = [("x", c_uint16, 9),
("y", c_uint8, 8),
("z", c_uint16, 4)]
bf = test_bitfield(1,255,3)
print(bf.x, ", ", bf.y, ", ", bf.z)
好吧……理智
但是
(1, ', ', 255, ', ', 3)
打印:from ctypes import *
class test_bitfield(Structure):
_fields_ = [("x", c_uint16, 9),
("y", c_uint8, 7),
("z", c_uint16, 4)]
bf = test_bitfield(1,255,3)
print(bf.x, ", ", bf.y, ", ", bf.z)