我声明了一个大字符数组,然后我随后从套接字读取以填充它。
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/