代码之家  ›  专栏  ›  技术社区  ›  Darrin

如何将(二进制==true)boost::beast::websocket::stream<tcp::socket>中的数据“读取”到缓冲区(boost::beast::flat_buffer?)中,使其不会转义?

  •  0
  • Darrin  · 技术社区  · 5 年前

    我使用boost::beast将数据从websocket读入std::字符串。我正紧随其后 websocket_sync_client.cpp 在Boost1.71.0中,有一个更改——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=================================
    

    这和我预想的差不多, 除了在(二进制)流的数据上发生某种转义之外

    读取的二进制数据包含许多(有意)不可打印的ASCII控制字符,用于分隔/组织消息中的数据块:

    我的问题必须有一个简单的解决方案。 如何使ws.read进入“rcvdS”的结果平面缓冲区包含真正原始的、未扫描的数据字节?

    这是一个视觉辅助-显示预期与实际数据: Here is a visual aid:

    0 回复  |  直到 5 年前
        1
  •  1
  •   Vinnie Falco    5 年前

    Beast不会以任何方式更改消息的内容。binary()和text()唯一要做的就是在另一端接收的消息中设置一个标志。文本消息根据合法字符集进行验证,而二进制消息则不进行验证。Beast从不更改消息数据。buffers_to_string只是将缓冲区中的字节传输到std::string,它不会转义任何内容。因此,如果缓冲区包含空值,或者说ctrl+a,那么std::字符串中将分别得到0x00和0x01。

    如果您的消息正在被编码或翻译,那么不是Beast在做这件事。也许这是将原始字节写入std::cout的结果?或者,它可以是您用来在发布的图像中显示这些消息的任何内容。我注意到您提供的代码与图像不匹配。

        2
  •  0
  •   Darrin    5 年前