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

Using .data() to turn a character array to a std::string doesn't convert the entire array

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

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�ZC �kL)读入缓冲区,这意味着有可能获得编码各种时髦字符的字符,如空字节、新行、等等 这可能是我的问题吗? .data() 是否在空字节或其他一些奇怪的字符处停止字符串转换?

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

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

basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, const CharT* s )

输出 s 作为空终止的 c 字符串。

您可能会使用:

  • std::cout.write(buf.data(), len)
  • std::cout << std::string_view{buf.data(), len}(或使用 std::string 的替代方法,但可能会分配)