0

我有以下数据包布局:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  char String[StringLen];
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
}

课程是这样的:

class ServerInfo
{
  short PacketSize;   //Size of the whole packet
  BYTE TotalServers; //total of PacketLayout structs
  PacketLayout Server[TotalServers];
  int GlobalSecCode;
  short EncryptedPacketSize; //Same as the first member, just xored
}

所以我遇到的问题是在类或结构中创建一个可变大小的数组,其大小取决于BYTE StringLen(对于结构)和BYTE TotalServers(对于类)指向的最后一个成员。

我不知道解决方案是什么,也许实现一个模板?,如果是这样我可以看到一个例子(我还不熟悉模板)而且我想引用我的成员名称而不自己计算指针位置(就像我现在正在做的那样)。

谢谢。

4

3 回答 3

2

可以使用模板执行此操作,例如:

template <int StringSize>
struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  char String[StringSize];
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
};

让您将其用作:

PacketLayout<100> pkt;

通常,您想要做的事情会更简单。例如,如果您重新排序数据包并知道大小的上限,您可以简单地执行以下操作:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[MAX_POSSIBLE_SIZE];
};

或者:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char *String;
};

String并在读取期间分配/设置。

就个人而言,虽然我会跳过所有这些杂乱的低级细节,并使用protobuf之类的东西来为您完成工作,让您可以自由地专注于更重要的更高级别的事情,从而为您的项目增加价值。

有时也会使用一个常见但肮脏的技巧:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[1];
};

人们在末尾将变量部分的大小定义为 1,然后故意分配比结构所需的内存更多的内存,以便他们可以写到结构的末尾。这是邪恶的,但非常不推荐。

于 2012-08-01T19:09:28.180 回答
0

使用模板绝对是要走的路:

template <size_t TotalServers>
class ServerInfo 
{
    PacketLayout Server[TotalServers];
    int GlobalSecCode;
};

这样做的缺点是没有一个ServerInfo可分配给另一个,因此可能使用 astd::vector很重要,如果这对您来说意义重大。

于 2012-08-01T19:10:11.210 回答
0

C++ 中没有很好的方法来实现这一点。

这是在 PacketLayout 中创建可变大小数组的方法:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[1];
}

然后你分配一个实例:

PacketLayout* createPacketLayout(BYTE stringLen)
{
    PacketLayout* packetLayout = (PacketLayout*)new char[sizeof(PacketLayout) - 1 + stringLen];
    packetLayout->StringLen = stringLen;
    return packetLayout;
}

在这种情况下,ServerInfo 可以保存指针数组。

于 2012-08-01T19:22:44.013 回答