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

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

本文关键字:数组 转换 string data std 字符 使用      更新时间:2023-10-16

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

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 结尾的字符串,因此输出将在遇到的第一个字符处停止。

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

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

输出s为以 null 结尾的 C 字符串。

您可以使用:

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