-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

您可以将字符串复制到高级 std::string 中(至少,如果我的猜测String是 typedef forconst char*是正确的):

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

我会推荐一个只解释数据包数据的 shell 类。

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,您必须读取超出中1定义的字节数组边界struct。但是,这是 C 语言中常用的技术。

但是,在 C++ 中,您不必求助于这种 hack,因为您可以定义访问器方法来适当地处理可变长度数据。

于 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 回答