2

我尝试做的是基于模板创建一个类,它将充当python-bitstring或 Python Hachoir。最终目标是描述一些规则或模式来解析给定的二进制文件(101 hex 编辑器具有类似的酷特性 -二进制模板)。

这是我如何看待实现的一个简单示例:

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)来存储所有二进制数据?

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

4

1 回答 1

3

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

但是,您可以将 boost::spirit 和朋友视为在(正常)编译时在 C++ 中执行此操作的一种方式。

如果你想自己做,你可以做类似的事情......

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

...并使用类型推导来确定正确的原始编码/解码。

于 2012-04-16T01:11:19.833 回答