如何将带有嵌套结构和数组的 Ctypes 结构转换为 python dict

How to convert Ctypes structure with nested structures and arrays to python dict

提问人:Mika 提问时间:7/21/2023 更新时间:7/21/2023 访问量:49

问:

我有一个结构(由 Mark Tolonen 设计,非常感谢他!(我决定不在这里重写它,以避免与该帖子的代码重复)。这种结构的特征是,结构可以包括另一个结构和数组,甚至数组与结构。

我试图创建一个函数,它将此结构转换为python dict。这是尝试:

    def _process_ctypes(self, ctypes_obj):
        if isinstance(ctypes_obj, ctypes.Structure):
            data_dict = {}
            for field_name, field_type in ctypes_obj.get_fields():
                field_value = getattr(ctypes_obj, field_name)
                if isinstance(field_value, (ctypes.Structure, ctypes.Array)):
                    data_dict[field_name] = self._process_ctypes(field_value)
                else:
                    data_dict[field_name] = field_value
            return data_dict
        elif isinstance(ctypes_obj, ctypes.Array):
            data_list = []
            for element in ctypes_obj:
                if isinstance(element, (ctypes.Structure, ctypes.Array)):
                    data_list.append(self._process_ctypes(element))
                else:
                    data_list.append(element)
            return data_list

但是,恕我直言,它看起来有点丑陋复杂。而且不可能将一些数据添加到最终输出中,只能在函数外部添加。

你有没有想过如何简化和重构这个函数,它将递归地遍历整个C结构,并收集所有嵌套结构和值数组的字典?输入 - 始终为 ctypes。结构,输出 - 始终 python.dictionary。

此外,将每个数组也转换为字典会很棒,只需使用一些特定的字符串作为键即可。

python c 算法 序列化 ctypes

评论

0赞 Anentropic 7/21/2023
“将每个数组也转换为字典就太好了,只需使用一些特定的字符串作为键”......这部分将如何工作?数组的内容是什么,它们是固定大小还是其他什么,因此您可以将数组中的特定位置与预定义的键相关联?
0赞 CristiFati 7/21/2023
github.com/CristiFati/cfpyutils/blob/master/ctypes.py#L41
0赞 Mika 7/21/2023
对不起,我没有谈论它,但是,数组的长度始终为 6 项(但这并不重要。 我正在尝试创建一个通用算法) 关于内容 - 它可以是另一个数组,也可以是另一个结构,或者只是一个简单的类型。这种结构的示例可以在文章开头的链接中看到
0赞 Mika 7/21/2023
@CristiFati 非常感谢。这是对控制台输出算法的一个非常好的实现。但是,老实说,它代表了对我的任务:)来说太漂亮的输出了我只需要将数据放入 pandas csv 中。只要它与python dict配合良好,我想将C结构转换为dict。

答: 暂无答案