【问题标题】:Data format binary schema description and decoding in pythonpython中的数据格式二进制模式描述和解码
【发布时间】:2016-11-10 03:29:48
【问题描述】:

我正在创建一些用于解码各种二进制格式的 python 脚本。 每种格式都有许多不同的记录,并且相当多的数据在特定字节内的特定位范围内编码。 因此,我正在寻找一个 python 包,它可以巧妙地将解码代码和格式规范分开,这样代码就不会太乱。 理想情况下,它可以让我保留不同版本的格式。 下面是我正在寻找的内容的一个非常粗略的大纲。

例如my_data_format.xml:

<format version="1A">
  <record name="My first record">
    <ignore bytes="2" />
    <field name="A simple number" bytes="1" convert_to="int" />
    <field name="A simple float" bytes="4" convert_to="float" />
    <array name="A list of floats" length="3">
      <field bytes="4" convert_to="float"
    </array>
    <field bytes="2">
      <ignore bits="5" />
      <bitfield name="First bit-field" num_bits="6" convert_to="uint8" />
      <bitfield name="Second bit-field" num_bits="5" convert_to="float" />
    </field>
  </record>
</format>

示例python脚本my_data_reader.py:

from binary_schema import load_schema

schema = load_schema('my_data_format.xml')

with open(̈́'myfile.bin', 'rb') as f:
  decoded_data = schema.read_record_from_stream('Record header', f)

print(decoded_data)

这会产生一本字典:

{'A simple float': 3.234,
 'A simple number': 3,
 'A list of floats': [1., 2., 3.],
 'First bit-field': 3,
 'Second bit-field': 2.0}

有这种事吗?

我已经看过几件事了:

  • 我知道像 protocol buffers 这样的东西对于指定记录很有用,但据我了解,它不支持指定位域及其解释。

  • DFDL 似乎正是我所需要的,但我只见过一个 Java 客户端,它看起来像是一个庞大的软件包(尽管某处显然有一个 C 版本)。

  • 我当前的实现使用construct,效果很好,但感觉比从文件中加载架构有点混乱

【问题讨论】:

  • 我一直在寻找相同的东西。好奇你是否找到了另一种选择。我wrote a module 使用元类将类描述转换为格式读取器/写入器,但读取速度很慢,就像一个数量级一样。我发布了一个依赖 cython 的 newer/faster version,但目前它有点问题。

标签: python parsing schema binaryfiles dfdl


【解决方案1】:

查看https://kaitai.io/“Kaitai Struct:一种开发二进制结构解析器的新方法。”

我想你会发现它会做你需要的,模式不是 XML,但我认为格式也比 XML 灵活得多。

【讨论】:

  • 哇。看起来很棒。谢谢!
猜你喜欢
  • 2016-11-10
  • 2011-11-23
  • 1970-01-01
  • 2022-10-31
  • 2010-09-17
  • 1970-01-01
  • 2019-03-07
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多