C++ 可变长度字符串
我有一个数据包结构,它有一个变量len作为字符串示例:C++ 可变长度字符串,c++,visual-studio,C++,Visual Studio,我有一个数据包结构,它有一个变量len作为字符串示例: BYTE StringLen; String MyString; //String is not a real type, just trying to represent an string of unknown size 我的问题是如何在不知道成员大小(在本例中为字符串)的情况下在结构中实现此数据包。下面是一个我希望它“看起来像”的例子 我认为这是不可能的,因为编译器直到运行时才知道字符串的大小。那么,怎样才能让它看起来更高层次,更容
BYTE StringLen;
String MyString; //String is not a real type, just trying to represent an string of unknown size
我的问题是如何在不知道成员大小(在本例中为字符串)的情况下在结构中实现此数据包。下面是一个我希望它“看起来像”的例子
我认为这是不可能的,因为编译器直到运行时才知道字符串的大小。那么,怎样才能让它看起来更高层次,更容易理解呢
我需要为每个数据包构造文档的原因是,用户实际上必须查看分析数据包的任何函数
因此,我可以继续问:有没有办法声明一个大小未定义的结构或类似结构的东西?您可以将字符串复制到一个高级std::string(至少,如果我猜
string
是const char*
的typedef是正确的话):
void ProcessPacket(const PacketStruct&packet)
{
std::string highLevelString(packet.MyString,
静态播放(packet.StringLen));
...
}
我建议使用一个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代码):
但是,您正在输入未定义的行为,因为要访问strpack
中的全部数据,您必须读取1
在结构中定义的字节数组边界之外的数据。但是,这是C语言中常用的技术
<>但是,在C++中,你不必求助于这样的黑客,因为你可以定义访问器方法来适当地处理可变长度的数据。 < P>根据你的帖子的一个简单的变体是:
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;
}
你是怎么解决这个问题的?这个问题还不清楚:我不知道你在问什么。很简单,我怎么能让一个结构或类有一个变量len字符串。。。并在一个可理解的方法上引用其成员。仅举一个例子,我想知道是否有一种方法可以让编译器理解一个可变大小的成员位于该位置。您还想要什么?这只是一个简单的问题,难道没有办法将数据包表示成一个结构吗?假设数据包可能有未定义大小的成员?。我想使用structs的原因是我需要在源代码中记录大部分数据包,而不让用户实际查看它的实现。@user1175832:旧的C风格方法是用一个小字符数组(例如1)声明struct
的最后一个参数。但是,这种方法没有任何类型的安全性,所以我不知道你为什么会喜欢它。
struct StringPacketC *strpack = (struct StringPacketC *)packet;
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);
}