首页 > 解决方案 > ctypes:c_uint8 是否支持位字段?

问题描述

我在玩一些 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变成 a c_uint16,我得到了我从一开始就期望得到的东西:9, 9, 9.

浏览一下文档,我发现位域仅适用于整数字段,而这并没有真正指定c_uint8不支持。然后我参考了可用的测试,我看到没有c_uint8c_char包括在内。但是,尝试使用 ac_char会引发 TypeError,而 c_uint8 不会引发。

有人可以澄清发生了什么吗?位字段只是没有实现uint_8吗?还是我只是用错了?任何类型的澄清都非常感谢!

提前致谢!

标签: pythonctypesbit-fields

解决方案


注意:Mac OS X python 2.7 和 3.6 具有相同的输出

所以...由于某种原因,您不能使用带符号或无符号的 8 位类型并将它们与位域分开...我将查看文档以了解“为什么”

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)

输出:(1, ', ', 63, ', ', 3)这很酷,删除了 2 个最高位: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)

印刷:(1, ', ', 0, ', ', 3)


推荐阅读