使用 .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
的替代方法,但可能会分配)
我声明了一个大字符数组,然后我随后从套接字中读取以填充它。
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
的替代方法,但可能会分配)