python中的数据格式二进制模式描述和解码

时间:2016-07-07 17:32:08

标签: python parsing schema binaryfiles dfdl

我正在创建一些用于解码各种二进制格式的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,效果很好,但感觉比从文件加载模式更麻烦

1 个答案:

答案 0 :(得分:1)

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

我认为您会发现它可以满足您的需求,模式不是XML,但是我认为格式也比XML灵活得多。