0

C++ を使用して、抽象プロトコル クライアント サーバー会話解析ライブラリを実装する必要があります。クライアントとサーバーの会話全体を含むファイルはありませんが、その場で解析する必要があります。次のインターフェースを実装する必要があります。

class parsing_class
{
  public:
  void on_data( const char* data, size_t len );
  //other functions
  private:
  size_t pos_;// current position in the data flow
  bool first_part_parsed_;
  bool second_part_parsed_;
  //... some more bool markers or something like vector< bool >
};

データは関数を介してクラスに渡されon_dataます。データ チャンクの長さは、呼び出しごとに異なります。私はプロトコルのパケット形式を知っており、会話がどのように編成されるべきかを知っているので、一部pos_を解析するのに十分なデータがあるかどうかを現在で判断できNthます。これで、実装は次のようになります。

void parsing_class::on_data( const char* data, size_t len )
{
   pos_ += len;
   if( pos > FIRST_PART_SIZE and !first_part_parsed_ )
     parse_first_part( data, len );
   if( pos > SECOND_PART_SIZE and !second_part_parsed_ )
     parse_second_part( data, len );
   //and so on..  
}

私が欲しいのは、このアルゴリズムを最適化する方法のヒントです。おそらく、これらの多数を避けるためですifon_data非常に多くの回数が呼び出される可能性があり、そのたびにすべてのスイッチを通過する必要があります)。

4

1 に答える 1

1

次の部分に進むことができるように、会話が通過したものの状態を保持するだけのように見えるため、これらすべてboolとは必要ありません。pos_

以下はどうでしょうか: 会話の各部分の解析関数を自分で作成します。

bool parse_part_one(const char *data) {
    ... // parse the data
    next_fun = parse_part_two;
    return true;
}
bool parse_part_two(const char *data) {
    ... // parse the data
    next_fun = parse_part_thee;
    return true;
}
...

クラスでは、1 から始まる現在の解析関数へのポインターを追加します。あとはon_data、次の解析関数を呼び出すだけです

bool success = next_fun(data);

各関数は次の解析関数へのポインターを設定するため、次の のon_data呼び出しは次の解析関数を自動的に呼び出します。会話のどこにいるかをテストする必要はありません。

の値lenが重要である場合 (私はそうなると思います)、それを渡し、falseその部分を解析できなかったことを示すために戻ります (next_funその場合も更新しないでください)。

于 2013-07-14T11:22:25.960 に答える