python - 如何在python中用字节字符串打包大型结构
问题描述
我是 python 新手,正在寻找将字节字符串打包到 python ctypes 类中的指导,该类对应于具有 ~100 个字段的 C 结构。除了定义一个非常大(且容易出错)的格式字符串以用于 pack() 之外,还有其他方法吗?这个任务在 C 语言中使用 memcpy() 非常简单。我的目标是显示和分析这些字段。
谢谢你。
解决方案
ctypes.Structure
子类允许您在 Python 中定义相同的结构,其内存布局可以memcpy
通过memoryview
. 它的输入更多,但也比长struct
格式字符串更不容易出错。
一旦定义,memcpy
Python 中的等价物将是:
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)
推荐阅读
- prism - 在 TabPage 子视图模型上未调用销毁
- python - 如果有人离开 Discord.py,我的队列机器人正在清空队列
- node.js - 在sequelize中分配外键的默认值后自动同步出错
- python - 每次在 pythonanywhere 上使用后如何清除用户输入-尝试使用 Flask 会话
- java - 除了 TimerTask 之外,还有其他方法可以在另一个应用程序上显示覆盖吗?
- arrays - 使用 Ansible 从 3 个列表中构造 dict
- c# - 如何创建现有抽象类作为父类进行继承
- caching - 如何在“SELECT `filename` FROM `system` WHERE NAME = ? AND TYPE = ?”上启用缓存 查询结果在drupal中?
- javascript - 在nodejs中使用twitter API时如何解决“被CORS策略阻止”?
- python - tf.boolean_mask 输出的最后一个维度是 None