将缓冲区转换为字符串 C++ boost

Posted

技术标签:

【中文标题】将缓冲区转换为字符串 C++ boost【英文标题】:converting buffer to string C++ boost 【发布时间】:2014-06-25 17:06:40 【问题描述】:

我已经编写了客户端服务器通信。然而,在 C++ 客户端解析缓冲区时,我丢失了大部分数据。我已经了解问题所在,但仍然不知道如何解决: 代码:

            std::cout << b.max_size() <<std::endl;
    boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(50000);
    size_t n = socket.receive(bufs);
    // received data is "committed" from output sequence to input sequence
    b.commit(n);
    std::istream is(&b);
    std::string s;
    is >> s;

我分配的缓冲区大小 = 5000(最大大小为 429496)。我在这行的问题是 b.commit(n); std::istream is(&b);并且字符串s的大小是119,这是不可接受的。

【问题讨论】:

是否有其他方法可以将缓冲区转换为字符串,因为我使用了协议缓冲区,我需要使用 object.ParseFromString(s); &gt;&gt;格式化 I/O 并在第一个空白字符处停止。 我可以忽略这个空间吗 对 boost.asio 不太熟悉,但查看文档,我会尝试类似boost::asio::streambuf::const_buffers_type data = b.data(); std::string s(data.begin(), data.end()); 为什么不直接使用ParseFromIstream() 而不是将额外的副本复制到字符串中? 【参考方案1】:

如果要获取整个缓冲区,请执行以下操作:

streambuf::const_buffers_type bufs = b.data();
std::string s(buffers_begin(bufs), buffers_begin(bufs) + b.size());

或者像这样:

streambuf::const_buffers_type bufs = b.data();
std::string s(buffers_begin(bufs), b.size());

或者:

string s(buffer_cast<const char*>(b.data()), b.size());

可以找到相应的文档here。

【讨论】:

以上是关于将缓冲区转换为字符串 C++ boost的主要内容,如果未能解决你的问题,请参考以下文章

如何将 boost::iarchive 的流设置为空流

将 C++ 字符串操作转换为 C 的问题 [关闭]

如何使用 PInvoke 将 std::wstring 从 C++ 返回到 C# 而无需编写字符串缓冲区转换 [重复]

发生缓冲区溢出

std::string 与字节缓冲区(c++ 中的差异)

C++ fmtlib:如何将双精度转换为现有的 wchar_t 缓冲区?