我正在尝试使用从一些内存istringstream
中重新创建编码。wstring
内存布局如下:
- 1 个字节表示 wstring 编码的开始。任意这是'!'。
- n 个字节,以文本格式存储字符串的字符长度,例如 0x31、0x32、0x33 将是“123”,即 123 个字符的字符串
- 1 字节分隔符(空格字符)
- n 个字节,它们是组成字符串的 wchars,其中 wchar_t 是每个 2 字节。
例如字节序列:
21 36 20 66 00 6f 00 6f 00
是“!6 foo”(使用点表示 char 0)
我所拥有的只是一个 char* 指针(我们称它为pData
),指向内存块的开头,其中包含此编码数据。使用数据重构 wstring(“foo”)并将指针移动到编码数据末尾之后的下一个字节的“最佳”方式是什么?
我正在玩弄使用 istringstream 来允许我使用前缀字节、字符串的长度和分隔符。之后,我可以计算要读取的字节数并使用流的read()
函数插入到适当调整大小的 wstring 中。问题是,我如何首先将这些内存放入 istringstream 中?我可以尝试先构造一个字符串,然后将其传递给 istringstream,例如
std::string s((const char*)pData);
但这不起作用,因为字符串在第一个空字节处被截断。或者,我可以使用字符串的其他构造函数来明确说明要使用多少字节:
std::string s((const char*)pData, len);
len
这有效,但前提是我事先知道是什么。鉴于数据是可变长度的,这很棘手。
这似乎是一个真正可以解决的问题。我的字符串和流的新手状态是否意味着我忽略了一个简单的解决方案?还是我用整个字符串方法吠叫错误的树?