如何使用 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
模块,但看起来你需要的不止这些——例如嵌套union
s 和struct
s。
【参考方案1】:
如果你需要在python中映射这些字节,你可以使用struct.unpack()
官方Python Documentation会告诉你怎么写format参数来映射C类型。
例子:
import struct
mapped_bytes = struct.unpack(">ii", example_bytes)
【讨论】:
struct
仅适用于原始类型的平面集合。不适合嵌套的struct
s 或union
s。
我没有太多的拆包经验,所以我可能是错的,但只要他们知道那些嵌套的struct
s 和union
s 包含什么,不应该吗?还是要使用unpack()
?
对于嵌套的struct
s,问题是失去了所有的嵌套。对于union
,必须单独打开所有箱子的包装。两者都可以手动恢复,但它比仅使用 struct
模块要复杂得多。
是的,我就是这个意思。我知道你会失去嵌套,我只是想确保它实际上是可能的。
您可以使用 ctypes 模块对 C 结构进行任何操作。您可以嵌套它们,声明数组等。以上是关于如何使用 Python 将字节映射到 C 结构?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 std::map 将 bool 映射到 3d 点结构?