c++ - 使用 .data() 将字符数组转换为 std::string 不会转换整个数组

标签 c++ string buffer

我声明了一个大字符数组,然后我随后从套接字读取以填充它。

boost::array<char, 32841> buf{}
size_t len = boost::asio::read(socket, aio::buffer(buf, 32841));

如果我打印出len,我会正确地得到32841,当我单独循环遍历数组中的所有字符时,就像这样,

for (char i : buf) {
    std::cout << i << std::endl;
}

我得到每个字符的输出。但是,当我尝试打印缓冲区的字符串形式(通过 buf.data() )时,事情并没有按照我希望的那样工作。我没有打印出所有字符——只打印了大约 20 个字符。

我正在将一堆加密垃圾(例如,�Q{��=� �o$9�ZC �kL)读入缓冲区,这意味着有可能获取字符编码各种时髦的字符,如空字节、换行符等。这可能是我的问题吗? .data() 是否会在空字节或其他奇怪字符处停止字符串转换?

最佳答案

boost::array<char, N>::data() (和 std::array<char, N>::data() )返回 const char* 。将此指针传递给 std::cout <<将假定一个以 null 结尾的字符串,因此输出将停止在第一个 \0 处。遇到的字符。

要查看完整数据,请使用 std::cout.write(buf.data(), len)相反。

关于c++ - 使用 .data() 将字符数组转换为 std::string 不会转换整个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220520/

相关文章:

go - 如何在 Go 中有效地处理大型数据数组(超过 10MiB)?

javascript - 将utf8字符串(图像)解码到node.js中的buffer/Image

c++ - 使用图权重 boost 深度优先访问者最小生成树

c - 如何为只读字符串重新分配内存?

c++ - 如何调用返回 double 或字符串并将其保存在 map 上但作为对象的类的方法

string - 如何使用R的c api分配字符串?

string - Lua:删除字符串中的特定字符

Python struct 使用反向字节顺序解压多个字节

c++ - 当价格 float 时对订单簿进行排序

c++ - 如何在 Qt 中更改 QCheckBox 文本标签颜色?