c++ - 使用istringstream处理一个变长的内存块

标签 c++ string stl stringstream

我正在尝试使用 istringstream 从一些内存中重新创建编码的 wstring。内存布局如下:

  1. 1个字节表示wstring编码的开始。这是任意的 '!'。
  2. n 字节,以文本格式存储字符串的字符长度,例如0x31、0x32、0x33 将是“123”,即 123 个字符的字符串
  3. 1字节分隔符(空格符)
  4. n 个字节,它们是组成字符串的 wchar,其中 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 是什么。鉴于数据是可变长度的,这很棘手。

这似乎是一个真正可以解决的问题。我在字符串和流方面的新手身份是否意味着我忽略了一个简单的解决方案?还是我用整个字符串方法找错了树?

最佳答案

尝试设置您的 stringstream 的 rdbuf :

char* buffer = something;
std::stringbuf *pbuf;
std::stringstream ss;

std::pbuf=ss.rdbuf();
std::pbuf->sputn(buffer, bufferlength);
// use your ss

编辑:我看到这个解决方案会遇到与您的 string(char*, len) 情况类似的问题。你能告诉我们更多关于你的缓冲区对象的信息吗?如果您不知道长度,并且它不是以 null 终止的,那么将很难处理。

关于c++ - 使用istringstream处理一个变长的内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296535/

相关文章:

c++ - Qt自定义QPushButton点击信号

c++ - 用编译时生成的随机 ID 替换魔法 ID 号

c++ - OpenGL 中的快速文本渲染

c++ - 遍历数组时出现段错误

string - Lua 是否优化连接空字符串?

java - 分组时如何根据一个字段中最长的 'string'从mysql数据库中选择记录?

ios - 为什么我的 UILabel 没有被设置?

c++ - 设置比较器类型预期错误

带有 unique_ptr 的 C++ 嵌套映射

c++ - 获取 map 内容作为数组