我有一个包结构,它有一个字符串示例的变量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;
}
我认为不可能,因为编译器在运行时之前不知道字符串的大小。那怎么能让它看起来高水平又易于理解?
我需要为每个数据包构建文档的原因,而用户实际上不必查看分析数据包的任何函数。
所以我可以恢复这个问题:有没有办法声明一个未定义大小的成员结构或者作为结构接近的东西?
答案 0 :(得分:0)
你可以将字符串复制到高级std :: string中(至少,如果我猜String
是const char*
的typedef是正确的话):
void ProcessPacket( const PacketStruct& packet )
{
std::string highLevelString( packet.MyString,
static_cast< size_t >( packet.StringLen ) );
...
}
答案 1 :(得分: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 ++中,您不必诉诸于此类黑客,因为您可以定义访问器方法以适当地处理可变长度数据。
答案 2 :(得分: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);
}