-3

文字列の例の変数 len を持つパケット構造体があります。

BYTE StringLen;
String MyString; //String is not a real type, just trying to represent an string of unknown size

私の質問は、メンバー (この場合は文字列) のサイズを知らなくても、構造体内でこのパケットを実装する方法です。これは、「次のように見える」方法の例です

void ProcessPacket (PacketStruct* packet)
{
     pointer = &packet.MyString;
}

コンパイラは実行時まで文字列のサイズを知らないため、作成することはできないと思います。では、どうすればハイレベルで分かりやすく見せることができるでしょうか?

私が必要とする理由は、ユーザーが実際にパケットを分析する関数を調べなくても、すべてのパケットを文書化するための構造体です。

だから私は質問を再開することができます:未定義のサイズのメンバーの構造体または構造体に近いものを宣言する方法はありますか?

4

3 に答える 3

0

パケット データを解釈するだけのシェル クラスをお勧めします。

struct StringPacket {
    char *data_;
    StringPacket (char *data) : data_(data) {}
    unsigned char len () const { return *data_; }
    std::string str () const { return std::string(data_+1, len());
};

コメントで述べたように、可変サイズのパケットをstruct. これを行う古い C の方法は、struct次のような を作成することでした。

struct StringPacketC {
    unsigned char len_;
    char str_[1]; /* Modern C allows char str_[]; but C++ doesn't */
};

次に、データをキャストします (これは C コードであることを思い出してください)。

struct StringPacketC *strpack = (struct StringPacketC *)packet;

ただし、未定義の動作を開始しています。これは、 のデータの全範囲にアクセスするには、で定義されているバイト配列の境界strpackを超えて読み取る必要があるためです。ただし、これは C で一般的に使用される手法です。1struct

しかし、C++ では、アクセサ メソッドを定義して可変長データを適切に処理できるため、このようなハックに頼る必要はありません。

于 2012-07-25T08:42:56.663 に答える
0

あなたの投稿によると、単純なバリアントは次のようになります。

struct PacketStruct {
   std::string MyString;
   size_t length () const { return MyString.length(); }
   const char* operator & () const { return MyString.c_str(); }
};

これは、上記のように(ほぼ)使用できます。

 void ProcessPacket (const PacketStruct& packet)
{
  const char * pointer = &packet;
  size_t length = packet.length();
  std::cout << pointer << '\t' << length << std::endl;
}

次のように呼び出す必要があります。

 int main()
{
 PacketStruct p;
 p.MyString ="Hello";
 ProcessPacket(p);
}
于 2012-07-25T09:12:41.310 に答える
0

文字列を高レベルの std::string にコピーできます (少なくとも、Stringtypedef であると推測するのconst char*が正しければ):

void ProcessPacket( const PacketStruct& packet )
{
  std::string highLevelString( packet.MyString,
                               static_cast< size_t >( packet.StringLen ) );
  ...
}
于 2012-07-25T08:39:58.713 に答える