0

独立した構造体によって定義された一連のメッセージがあります。これらの構造体は、アプリケーション間で送信される共通のヘッダーを共有します。これらの構造体を使用して作成されたメッセージの生データキャプチャを取得し、それらをプレーンテキストにデコード/解析するデコーダーを作成しています。

デコードする必要のある1000を超える異なるメッセージがあるため、すべての構造体形式をXMLで定義してから、XSLまたは何らかの変換を使用するのが最善の方法か、それともこれを行うためのより良い方法があるのか​​わかりません。

100万を超えるメッセージを含むログをデコードする必要がある場合があるため、パフォーマンスが問題になります。

デコーダー/パーサーの作成に取り掛かるテクニック/ツール/アルゴリズムに関する推奨事項はありますか?

struct:
struct {
  dword messageid;
  dword datavalue1;
  dword datavalue2;
} struct1;

生データの例:

0101010A0A0A0A0F0F0F0F

デコードされたメッセージ(望ましい出力):

message id: 0x01010101, datavalue1: 0x0A0A0A0A, datavalue2: 0x0F0F0F0F

私はこの開発を行うためにC++を使用しています。

4

4 に答える 4

0

「パフォーマンス」について-ディスクIOと可能なディスプレイIOを使用している場合、本当に恐ろしいアルゴリズムを使用しない限り、パーサー/デコーダーが大きな効果を発揮することはないと思います。

また、問題が何であるかについてもわかりません-現在の質問を考えると-構造体に3つのDWORDがあり、これらの値に基づいて1000を超える固有のメッセージがあると主張しています。

デコードされたメッセージは、何らかの解析が必要であることを意味するものではありません。単純な出力が機能しているようです(バイトから16進値のASCII表現に変換)

値から文字列へのマッピングがある場合、大きなswitchステートメントは単純です-または、これらを動的に追加したり、表示を変更したりできるようにしたい場合は、キーと値のペアを提供します(マッピング)構成ファイル(テキスト、xmlなど)で、ログファイル/生データが読み取られるときにルックアップを実行します。

その場合、マップを使用します。

おそらく、値とデコードされた出力の別の特定の例を提供すると、より適切な提案を思い付くことができます。

于 2008-12-16T18:23:54.513 に答える
0

レコードをフォーマットして出力するだけでよいと仮定します。

カスタム コード ジェネレーターを使用します。生成されたコードは次のようになります。

typedef struct { word messageid; } Header;

//repeated for each record type
typedef struct {
    word messageid;
    // <members here>
} Record_##;
//END


void Process(Input inp, Output out) {
    char buffer[BIG_ENOUGH];
    char *offset;

    offset = &buffer[BIG_ENOUGH];

    while(notEnd) {
        if(&offset[sizeof(LargestStruct)] >= &buffer[BIG_ENOUGH])
            // move remaining buffer to start and fill tail from inp

        Header *hpt = (Header*)offset;

        switch(hpt->messageid)
        {
            //repeated for each record type
            case <recond ID for given type>: 
            {
                Record_##* rpt = (Record_##*)offset;
                outp.format("name1: %t, ...\n", rpt->name1, ...);
                offset += sizeof(Record_##);
                break;
            }
            //END
        }
    }
}

そのほとんどはボイラープレートなので、それを生成するプログラムを書くことは難しくありません。

さらに処理が必要な場合は、このアイデアを微調整して、それを機能させることもできると思います。


編集:質問を読み直した後、構造体がすでに定義されているようです。その場合、#includeそれらだけを直接使用できます。ただし、構造体を解析してフォーマット関数への入力を生成する方法の問題が発生します。そこでは awk や sed が便利かもしれません。

于 2009-07-28T16:42:13.680 に答える