【发布时间】:2020-03-31 18:11:54
【问题描述】:
我正在使用 boost::beast 将数据从 websocket 读取到 std::string。我密切关注boost 1.71.0 中的示例websocket_sync_client.cpp,有一个变化——I/O 以二进制形式发送,服务器端没有文本处理程序,只有二进制流。因此,在示例中,我添加了一行代码:
// Make the stream binary?? https://github.com/boostorg/beast/issues/1045
ws.binary(true);
一切都按预期工作,我“发送”一条消息,然后使用 boost::beast::buffers_to_string 将我发送的消息的响应“读取”到 std::string:
// =============================================================
// This buffer will hold the incoming message
beast::flat_buffer wbuffer;
// Read a message into our buffer
ws.read(wbuffer);
// =============================================================
// ==flat_buffer to std::string=================================
string rcvdS = beast::buffers_to_string(wbuffer.data());
std::cout << "<string_rcvdS>" << rcvdS << "</string_rcvdS>" << std::endl;
// ==flat_buffer to std::string=================================
这和我预期的差不多,除了在(二进制)流的数据上发生了某种转义。 毫无疑问,某些增强逻辑层(可能是字符特征?)已启用/导致所有不可打印字符为 '\u????'转义的、人类可读的文本。
读取的二进制数据包含许多(有意的)不可打印的 ASCII 控制字符来分隔/组织消息中的数据块:
我宁愿不让流转义这些不可打印的字符,因为无论如何我都必须“撤消”这项工作,如果我不能强制“读取”缓冲区按原样保留数据,那么原始数据。如果我必须找到另一个 boost API 来撤消转义,那只是浪费处理,这无疑会损害性能。
我的问题必须有一个简单的解决方案。 如何使生成的 flat_buffer(即 ws.read 到 'rcvdS' /class,这样就不会发生转义?
【问题讨论】: