我有以下数据包布局:
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 (对于struct)和 BYTE TotalServers 指向的最后一个成员strong>(对于班级)。
我不知道解决这个问题的方法是什么,也许可以实现一个模板?如果是这样我可以看到一个例子(我还不熟悉模板)我还想引用我的成员名而不计算指针我自己的位置(正如我现在所做的那样)。
感谢。
答案 0 :(得分: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然后故意分配比结构所需的更多的内存,这样他们就可以写出它的结尾。这是邪恶的,但不推荐。
答案 1 :(得分:0)
使用模板绝对是可行的方法:
template <size_t TotalServers>
class ServerInfo
{
PacketLayout Server[TotalServers];
int GlobalSecCode;
};
这样做的缺点是没有一个ServerInfo
可以分配给另一个,所以可能使用std::vector
很重要,如果这对你意义重大。
答案 2 :(得分: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可以包含指针数组。