2

私がやろうとしているのは、python-bitstringまたはPythonHachoirとして機能するテンプレートに基づいてクラスを作成することです。そして最後の目標は、特定のバイナリファイルを解析するためのいくつかのルールまたはパターンを説明することです(101の16進エディタには同様の優れた機能であるバイナリテンプレートがあります)。

これが私が実現をどのように見ているかの簡単な例です:

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++コードを出力します。

ただし、(通常の)コンパイル時にC ++でこれを行う方法として、boost::spiritとその仲間を見ることができます。

あなたがそれを自分でやりたいのなら、あなたは次のようなことをすることができます...

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 に答える