变量len字符串
variable len string
我有一个数据包结构,它有一个字符串的变量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;
}
我认为这是不可能的,因为编译器直到运行时才知道字符串的大小。那么,如何才能让它看起来更高层次、更容易理解呢?。
我之所以需要结构化它来记录每个数据包,而用户实际上不必查看任何分析数据包的函数。
因此,我可以继续提问:有没有一种方法可以声明一个具有未定义大小成员的结构或接近结构的东西
我推荐一个只解释数据包数据的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
中的全部数据范围,您必须在struct
中定义的1
字节数组边界之外进行读取。但是,这是C.中常用的技术
但是,在C++中,您不必求助于这样的破解,因为您可以定义访问器方法来适当地处理可变长度的数据。
您可以将字符串复制到高级std::字符串中(至少,如果我猜测String
是const char*
的typedef是正确的):
void ProcessPacket( const PacketStruct& packet )
{
std::string highLevelString( packet.MyString,
static_cast< size_t >( packet.StringLen ) );
...
}
根据您的帖子,一个简单的变体是:
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);
}