Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python c类型:c_uint8是否支持位字段?_Python_Ctypes_Bit Fields - Fatal编程技术网

Python c类型:c_uint8是否支持位字段?

Python c类型:c_uint8是否支持位字段?,python,ctypes,bit-fields,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.ui

我在玩一些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\u uint16
,我从一开始就得到了我所期望的:
9,9,9

浏览一下文档,我看到了这一点,它并没有真正指定不支持
c_uint8
。然后我参考了可用的,在这里我看到没有包含
c_uint8
c_char
。但是,尝试使用
c_char
会抛出类型错误,而c_uint8不会抛出类型错误

有人能澄清一下发生了什么事吗?对于
uint\u 8
,是否只是没有实现位字段?还是我用错了?非常感谢任何类型的澄清


提前谢谢

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

所以。。。由于某些原因,您不能使用有符号或无符号的8位类型,并用位字段对其进行除。。。我将查看文档中的“为什么”

输出:
(1',,63',,3)
这很酷,去掉了前两位:
255-128-64=63

打印:
(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)

c_uint8应该是一个整数字段,这是什么版本的python,在什么拱门上运行。。。。以及什么口译员(可能对外国金融机构的东西很重要)。。我想这不需要分析。这对我来说仍然是非常混乱的,因为通过修改我的示例,从结构和打印中去掉“x”,并保持所有其他内容不变,它实际上输出了我所期望的
9,9
。就好像相邻内存和数据类型也会影响位字段,这会告诉我们它正在做什么(意味着它被支持(?),尽管我还不知道它在做什么。
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)
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)