【问题标题】:Framework for building structured binary data parsers?构建结构化二进制数据解析器的框架?
【发布时间】:2011-07-15 09:59:58
【问题描述】:

我在 Pragmatic-Programmer 类型的代码生成方面有一些经验:指定平台中立格式的数据结构,并为代码生成器编写模板,这些模板使用这些数据结构文件并生成将原始字节提取到特定语言的代码数据结构,对数字数据进行缩放,打印出数据等。实用的(TM)想法是(a)我可以通过修改我的规范文件并重新生成源(这是 DRY 和所有这些)来更改数据结构) 和 (b) 我可以添加额外的功能,只需修改我的模板即可为我的所有结构生成这些功能。

我使用的是一个名为 Jeeves 的 Perl 脚本,它可以工作,但它是通用的,以及我想编写的任何函数来操作我从头开始编写的数据。

是否有任何框架非常适合为结构化二进制数据创建解析器? 我读到的 Antlr 表明这有点矫枉过正。我目前感兴趣的目标语言是 C#、C++ 和 Java,如果重要的话。

一如既往的感谢。

编辑:我会悬赏这个问题。如果有任何我应该关注的领域(要搜索的关键字)或您自己开发的其他解决此问题的方法,我很想听听。

【问题讨论】:

  • 不是一个现成的框架,但至少有一些值得思考的地方:okmij.org/ftp/Scheme/binary-parse.scm - 可以在 C# 中应用相同的方法。
  • 我不知道您为什么认为 ANTLR(或任何解析器生成器)是矫枉过正。你需要有某种方法来定义你的数据,这需要一种规范语言,在某个地方必须有一个解析器;为此目的编写一个完全临时的解析器没有什么意义。您还需要某种解析器来解析原始二进制数据;传统的解析器生成器通常用于处理文本,但您很容易滥用它们来处理二进制数据。现在,为了解析二进制数据,规则就足够了;可能不需要完整的 CFG。
  • @Ira:关于规范语言的要点。我的 Jeeves 工作中有一个,我只是使用它而不是添加或设计它。
  • ...(我评论的最后一句中的错字)“现在,对于解析二进制数据,正则表达式 (FSA) 可能就足够了;可能不需要完整的 CFG”。

标签: parsing code-generation binary-data


【解决方案1】:

您还可以查看一个相对较新的项目 Kaitai Struct,它为此目的提供了一种语言并且也有一个很好的 IDE: Kaitai.io

【讨论】:

    【解决方案2】:

    您可能会发现ASN.1 很有趣,因为它提供了一种抽象的方式来描述您可能正在处理的数据。如果您使用 ASN.1 抽象地描述数据,则需要一种方法将抽象数据映射到具体的二进制流,ECN (Encoding Control Notation) 可能是正确的选择。

    New Jersey Machine Toolkit 实际上专注于与指令集相对应的二进制数据流,但我认为那只是二进制流的超集。它具有非常好的功能,可以根据位字符串定义字段,并自动生成访问器和生成器。这可能特别有用 如果您的二进制数据结构包含指向数据流其他部分的指针

    【讨论】:

    • 非常感谢您的帮助! (+125)
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多