为何Python文档提及的BigEndianUnion在ctypes中不可用?
BigEndianUnion在Python 3.6.1 ctypes中不可用的问题
这确实是一个文档与实际实现不匹配的小坑,具体情况如下:
- 首先,Python官方文档明确说明:
要构建非原生字节序的结构,可使用BigEndianStructure、LittleEndianStructure、BigEndianUnion和LittleEndianUnion这些基类之一
- 但在你测试的特定环境——Python 3.6.1(默认版本,2017年7月13日,21:35:51)搭配GCC 4.8.5 20150623 (Red Hat 4.8.5-11)的Linux系统中,确实会出现矛盾:
- 导入
ctypes模块后能正常调用BigEndianStructure - 但尝试调用
BigEndianUnion时会提示找不到该属性
- 导入
这个问题本质是Python 3.6早期版本的实现疏漏,后续的Python 3.7及以上版本已经修复了这个文档与代码不一致的问题。如果必须在Python 3.6.1环境下使用大端序的Union,可以用这个临时 workaround 手动实现:
import ctypes class BigEndianUnion(ctypes.Union): _pack_ = 1 _byte_order_ = 'big'
这个自定义类的功能和官方的BigEndianUnion完全一致。
内容的提问来源于stack exchange,提问作者emezh
相关产品推荐
相关产品推荐

