二进制文件的结构验证

时间:2009-06-12 07:59:24

标签: validation binary

我正在研究正式指定各种二进制流格式的方法,并使用工具检查流是否符合规范。像XSD +任何XML验证工具。或者像在二进制级别上工作的非常复杂的grep表达式(最好不是 - 这真的很难读)。

有人知道有用的规范/工具吗?

[基本原理:我们每天都会收到许多第三方生成的二进制文件,很多时候他们使用的是生成无效文件的坏工具。我们希望为他们提供一个可以用作验证器的工具,我们不想为每种格式编写特定的工具。]

6 个答案:

答案 0 :(得分:3)

尝试Preon

  • 注释驱动
  • 条件部分
  • 表达语言

每个带注释的类都是Codec描述,能够同时生成EncoderDecoder

答案 1 :(得分:3)

如果您认为Java的.class文档文档是规范的一个很好的示例,请重新考虑Preon。 Preon为capturing it entirely,并生成this等文档。

实际上有一些其他举措可以捕获二进制编码文件的'语法'。 ASN.1很有用,但是如果您打算捕获 - 比如说 - Java类文件,它不会给你很多里程。对于BSDL,Flavor,BFlavor和其他一些举措也是如此。问题是:有二百万种编码二进制数据的方法,大量的二进制压缩技术,我认为这意味着永远不会完全捕获它,除非语言本身是可扩展的。

Google协议缓冲区基本上存在同样的问题。它定义了类似Corba的CDR,只要你不需要更先进的东西,它就是好的。 Google协议缓冲区不允许您捕获Java的类文件格式。

答案 2 :(得分:1)

这是一个有趣的问题,但如果存在这样的规范语言,我会非常惊讶。这是因为二进制文件的元结构可能性实际上是无限的。将其与XML进行比较,其中严格指定元结构(标记包含其他标记,只有一个属性可以具有一个名称等)。即使使用这种结构,编写XML的模式也很难!我能看到处理二进制文件格式的无限可能性的唯一方法是使用本身允许无限可变性的东西 - 图灵完整的编程语言。

这当然不是说对于您的特定问题域,无法生成有用的规范语言和处理器。我只是觉得你很难找到一个预制的。我希望这里的答案证明我错了!

答案 3 :(得分:1)

同时检查Google Protocol Buffers

  • Java / Python / C ++ API
  • 不错的DSL

答案 4 :(得分:0)

我认为一个很好的例子是Java的.class文件的规范:http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

答案 5 :(得分:0)

抽象语法表示法一:ASN.1。另请参见NCBI工具箱:http://www.ncbi.nlm.nih.gov/Sitemap/Summary/asn1.html