1

我有自己的类(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;
}

这段代码不好,因为:

  1. 假设每个字符串字符有 4 个字节的数据(可能更少),

  2. 使用 wxWidgets 3.0,wxString.GetData()返回wxCStrData而不是*void,因此编译器失败wr(s.GetData(),lng);,我不知道如何将其转换为简单的字节缓冲区。

奇怪,但我在谷歌上搜索了好几个小时都没有发现……而且我在 wxWidgets 文档中也没有发现任何有用的东西

问题是:

  1. 这是将 wxString 转换为字节缓冲区的首选、正确和安全的方法,

  2. 将字节缓冲区转换回 wxString 也是如此。

4

1 回答 1

2

对于任意 wxStrings,您需要以 UTF-8 或 UTF-16 格式序列化它们。前者是数据交换的事实标准,所以我建议使用它,但如果您知道您的数据偏向于占用空间比 UTF-8 少的字符类型,那么您可能更喜欢 UTF-16 和如果节省空间对您很重要。

假设您使用 UTF-8,则使用utf8_str()以下方法完成序列化:

wxScopedCharBuffer const utf8 = s.utf8_str();
wr(utf8.data(), utf8.length());

反序列化就像使用wxString::FromUTF8(data, length).

对于 UTF-16,您可以使用通用mb_str(wxMBConvUTF16)wxString(data, wxMBConvUTF16, length)方法,它们也可以与 一起使用wxMBConvUTF8,但上面的 UTF-8 特定方法更方便,并且在某些构建配置中更有效。

于 2015-08-13T15:08:28.877 回答