首页 > 解决方案 > 如何在python中用字节字符串打包大型结构

问题描述

我是 python 新手,正在寻找将字节字符串打包到 python ctypes 类中的指导,该类对应于具有 ~100 个字段的 C 结构。除了定义一个非常大(且容易出错)的格式字符串以用于 pack() 之外,还有其他方法吗?这个任务在 C 语言中使用 memcpy() 非常简单。我的目标是显示和分析这些字段。

谢谢你。

标签: python

解决方案


ctypes.Structure子类允许您在 Python 中定义相同的结构,其内存布局可以memcpy通过memoryview. 它的输入更多,但也比长struct格式字符串更不容易出错。

一旦定义,memcpyPython 中的等价物将是:

struct = MyStructure()

memoryview(struct).cast('B')[:] = mybytes

memoryview(struct)使用缓冲区协议创建底层原始内存.cast('B')的视图,将复杂结构的新视图作为原始字节返回,然后[:]用于从类似字节的对象中切片分配。

如果在构造时有可用的构造函数,也可以直接从缓冲区复制其他构造函数,例如:

struct = MyStructure.from_buffer_copy(mybytes)

或者如果mybytes是可变的bytearray(或其他一些可变的字节类对象),您实际上可以直接创建一个由它支持的结构:

# struct is now backed by mybytearray; changing it will change mybytearray
struct = MyStructure.from_buffer(mybytearray)

推荐阅读