我有自己的类(nBuffer),比如 wxMemoryBuffer,我用它来加载/保存自定义数据,它比使用流更方便,因为我有很多基于这些的不同数据类型的重载方法:
class nBuffer
{ // ...
bool wr(void* buf, long unsigned int length);// write
bool rd(void* buf, long unsigned int length);// read
}
我正在尝试实现从该缓冲区加载/保存 wxString 的方法。对于 wxWidgets 2.8,我使用了下一个代码(简化):
bool nBuffer::wrString(wxString s)
{ // save string:
int32 lng=s.Length()*4;
wr(&lng,4);// length
wr(s.GetData(),lng);// string itself
return true;
}
bool nBuffer::rdString(wxString &s)
{ // load string:
uint32 lng;
rd(&lng,4);// length
s.Alloc(lng);
rd(s.GetWriteBuf(lng),lng);// string itself
s.UngetWriteBuf();
s=s.Left(lng/4);
return true;
}
这段代码不好,因为:
假设每个字符串字符有 4 个字节的数据(可能更少),
使用 wxWidgets 3.0,
wxString.GetData()
返回wxCStrData
而不是*void
,因此编译器失败wr(s.GetData(),lng);
,我不知道如何将其转换为简单的字节缓冲区。
奇怪,但我在谷歌上搜索了好几个小时都没有发现……而且我在 wxWidgets 文档中也没有发现任何有用的东西。
问题是:
这是将 wxString 转换为字节缓冲区的首选、正确和安全的方法,
将字节缓冲区转换回 wxString 也是如此。