如何使用 Python 将字节映射到 C 结构?

Posted

技术标签:

【中文标题】如何使用 Python 将字节映射到 C 结构?【英文标题】:How to use Python to map bytes to C struct? 【发布时间】:2022-01-17 22:41:11 【问题描述】:

我有一个嵌套的 C 结构(大小非常大)和字节

// In C:
struct example1 
  int val1;
  int val2;
  int val3;
  int val4; 
  char c1;
  char c2;
  enum example2 e1;
  union example3 u1;
  struct example4 s1;
  ...
  ....
  ....
;
# In python
example1_bytes = b'\x08\x09\x0a\x0b...........'

如何将字节映射到 C 结构并访问成员?

【问题讨论】:

我想用python来处理 你试过在python写代码吗? 可以,但是结构很复杂,不知道怎么处理 您能否提供一个minimal reproducible example 来满足您的需求?通常的答案是 struct 模块,但看起来你需要的不止这些——例如嵌套unions 和structs。 【参考方案1】:

如果你需要在python中映射这些字节,你可以使用struct.unpack()

官方Python Documentation会告诉你怎么写format参数来映射C类型。

例子:

import struct
mapped_bytes = struct.unpack(">ii", example_bytes)

【讨论】:

struct 仅适用于原始类型的平面集合。不适合嵌套的structs 或unions。 我没有太多的拆包经验,所以我可能是错的,但只要他们知道那些嵌套的structs 和unions 包含什么,不应该吗?还是要使用unpack() 对于嵌套的structs,问题是失去了所有的嵌套。对于union,必须单独打开所有箱子的包装。两者都可以手动恢复,但它比仅使用 struct 模块要复杂得多。 是的,我就是这个意思。我知道你会失去嵌套,我只是想确保它实际上是可能的。 您可以使用 ctypes 模块对 C 结构进行任何操作。您可以嵌套它们,声明数组等。

以上是关于如何使用 Python 将字节映射到 C 结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::map 将 bool 映射到 3d 点结构?

将python字节转换为c结构

如何将递归数据映射到结构中?

如何为双指针结构参数应用 SWIG 类型映射

如何使用 swig 将 c++ int** 返回值类型映射到 python

如何在Python中将字符映射到整数范围[-128,127]?