【发布时间】:2011-01-18 18:52:16
【问题描述】:
我正在尝试使用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 f.o.o.” (用点表示 char 0)
我所拥有的只是一个 char* 指针(我们称之为pData),指向包含此编码数据的内存块的开头。消耗数据以重构 wstring(“foo”)并将指针移动到编码数据末尾之后的下一个字节的“最佳”方式是什么?
我正在玩弄使用 istringstream 来允许我使用前缀字节、字符串的长度和分隔符。之后,我可以计算要读取的字节数并使用流的read() 函数将其插入到适当调整大小的 wstring 中。 问题是,我如何首先将这些内存放入 istringstream? 我可以尝试先构造一个字符串,然后将其传递到 istringstream,例如 p>
std::string s((const char*)pData);
但这不起作用,因为字符串在第一个空字节处被截断。或者,我可以使用字符串的其他构造函数来明确说明要使用多少字节:
std::string s((const char*)pData, len);
这可行,但前提是我事先知道len 是什么。这很棘手,因为数据是可变长度的。
这似乎是一个真正可以解决的问题。我的字符串和流的新手状态是否意味着我忽略了一个简单的解决方案?还是我用整个字符串的方法叫错了树?
【问题讨论】:
标签: c++ string stl stringstream