2012-04-16 27 views
2

我所要做的是根据模板创建一个类,它将作为python-bitstring或Python Hachoir。最后的目标是描述一些规则或模式来解析给定的二进制文件(101十六进制编辑器有类似的酷功能 - Binary Templates)。如何开发一个类来解析使用模板和/或规则的二进制文件

下面是我如何看待实现一个简单的例子:

typedef struct _BINARYFILEFORMAT 
{ 
    short sMagic; 
    int sField_1, sField_2; 
    short sFrameLength; 
    int OverallLength; 
} 
    BinaryFileFormat; 

void main(int argc, char** argv) 
{ 
    // Storage for parsed file 
    BinaryFileFormat bff; 

    // Describing new pattern to parse a binary file with statistical information 
    Rule r = "<Magic>:2, 
      <Field_1>:4, 
      <Field_2>:4, 
      <FrameLength>:2, 
      <OverallLength>:4"; 

    // Parse the file and place all data into the structure 
    BinaryParser bp(r, "<path_to_file>", bff); 

    // Now we can work with BinaryFileFormat structure 
    // ... 
} 

所以,问题#1:我怎么可以在C做这种事++?它有可能吗?简单的线索或暗示将足以让我朝着正确的方向前进。

问题#2是:是否可以动态创建一个相应的结构(例如它的BINARYFILEFORMAT)来存储所有的二进制数据?

P.S.我知道,反序列化做类似的事情,但不是在我的情况 - 最终的结果,我想避免使用任何结构(当然,如果可能的话)。

+2

Boost.Spirit具有二进制解析器。 – 2012-04-16 01:11:40

回答

3

这种事通常是作为预编译步骤完成的。语法定义是由某个工具读取的。并且该工具输出C++代码,该代码包含数据结构以保存模型以及将其序列化并反序列化为文件所需的代码。

然而,你可以看看boost :: spirit和朋友作为一种在(正常)编译时在C++中执行此操作的方法。

如果你想自己做,你可以这样做......

Rule r = Rule("Magic", &BinaryFileFormat::sMagic, 2) + 
     Rule("Field1", &BinaryFileFormat::sField_1, 4) + 
     Rule("Field2", &BinaryFileFormat::sField_2, 4) + 
     ...; 

...和使用类型推演,以确定正确的原始编码/解码。

+0

非常感谢。我认为boost :: spirit是正确的。 – gahcep 2012-04-16 01:32:25

相关问题