python - 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_uint8
或c_char
包括在内。但是,尝试使用 ac_char
会引发 TypeError,而 c_uint8 不会引发。
有人可以澄清发生了什么吗?位字段只是没有实现uint_8
吗?还是我只是用错了?任何类型的澄清都非常感谢!
提前致谢!
解决方案
注意: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)
推荐阅读
- django - 通过电子邮件 django 发送 HTML 模板
- jsf - 当文本文件有前导空格时,上传文件 ricefaces 失败
- java - 如何为瑞典帐号生成 IBAN
- jquery - 需要有关 jquery ajax 的建议
- python - 使用 Excel 或 Python 求解器自动安排解决方案
- javafx - JavaFX TableView 数据格式化
- cql - 在 CQL 中查询日期
- oracle - 如何从 Amazon RDS 导出和导入架构 Oracle
- javascript - 如何使用 javascript 中的 moment.js / Date 将 EST 时间数据转换为本地时间
- javascript - React beautiful dnd 与 Material UI 列表的问题