ctypes:c_uint8是否支持位字段?

时间:2018-07-20 13:38:23

标签: python ctypes bit-fields

我正在研究一些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_uint8c_char。但是,尝试使用c_char会引发TypeError,而c_uint8不会引发。

有人可以澄清发生了什么吗?是否只为uint_8未实现位字段?还是我使用错了?任何澄清都是高度赞赏!

谢谢!

1 个答案:

答案 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)