如何不通过检查__name__字符串判断Python c_ubyte_Array类型
ctypes c_ubyte数组类型判断解决方案
所有ctypes数组类型都继承自公开的ctypes.Array基类,且每个数组类型都内置_type_属性指向其元素的类型,你可以组合这两个特征完成isinstance校验,完全替代字符串匹配逻辑。
修改后的可运行代码如下:
from ctypes import LittleEndianStructure, c_ubyte, Array class Mystruct(LittleEndianStructure): _fields_ = [ ('field1', c_ubyte * 5), ] def to_dict(self): d = dict((field, getattr(self, field)) for field, _ in self._fields_) for field in d: val = d[field] # 核心校验逻辑,无字符串匹配 if isinstance(val, Array) and type(val)._type_ is c_ubyte: d[field] = ''.join([f'{x:02x}' for x in val]) return d x = Mystruct.from_buffer_copy(b'AAAAAAAAA') print(x.to_dict())
逻辑说明
- 第一层
isinstance(val, Array)过滤出所有数组类型的字段,适配任意长度的数组 - 第二层
type(val)._type_ is c_ubyte确认数组元素为无符号字节类型,不会误识别其他类型的数组
内容的提问来源于stack exchange,提问作者mrkbutty
相关产品推荐
相关产品推荐

