gpt4 book ai didi

c++ - 如何从(binary == true)boost::beast::websocket::stream 将 'read'放入缓冲区(boost::beast::flat_buffer?),以便它不被转义?

转载 作者:行者123 更新时间:2023-12-02 10:23:05 42 4
gpt4 key购买 nike

我正在使用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来撤消转义,那只是浪费了处理,无疑会对性能造成不利影响。

我的问题必须有一个简单的解决方案。 如何使ws.read到'rcvdS'中的结果flat_buffer包含真正未经处理的原始字节数据? 是否可能,或者我是否必须简单地选择其他缓冲区模板/类,以免发生转义?

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

最佳答案

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

如果您的邮件是经过编码或翻译的,则不是Beast这样做。也许是将原始字节写入std::cout的结果?也可能是您用来在发布的图像中显示这些消息的任何方法。我注意到您提供的代码与图像不匹配。

关于c++ - 如何从(binary == true)boost::beast::websocket::stream <tcp::socket>将 'read'放入缓冲区(boost::beast::flat_buffer?),以便它不被转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59218413/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com