我想知道如何投std::tr1::array<unsigned char, 16>
到 std::string
?
编译器总是报错,我试过了
std::tr1::array<unsigned char, 16> sss;
string(sss);
string asd(sss);
两者都有效...
最佳答案
unsigned char
让这变得棘手。如果您知道您的系统使用 2s 补码 1 字节 8 位 unsigned char
和 char
,以及从 unsigned char
到 char 的隐式转换
做你想做的(这些并不总是正确的!),并且你的数组缓冲区是 null 终止的(即,第一个 0
之后的字符应该被丢弃),这个函数有效:
template<std::size_t N>
std::string to_string( std::array<unsigned char, N> const& arr ) {
std::string retval;
for( auto c : arr ) {
if (!c)
return retval;
retval.push_back(c);
}
return retval;
}
我对数组可能“已满”并且缺少空终止符的可能性有些偏执。
如果你真的想要所有 16 个 unsigned char
,即使有些是空的,你会想要使用这个:
std::string str( arr.begin(), arr.end() );
应该使用从 unsigned char
到 char
的隐式转换。
如果隐式转换没有按照您的意愿进行,并且您知道 array
的内存实际上是一个 char
数组,即使它的类型是 unsigned char
,你需要做一些重新解释转换。
对于空终止的情况:
template<std::size_t N>
std::string to_string_helper( const char* buf ) {
std::string retval;
if (!buf)
return retval;
for ( const char* it = buf; it < (buf+N); ++it ) {
if (!*it)
return retval;
retval.push_back(*it);
}
return retval;
}
template<std::size_t N>
std::string to_string_2( std::array<unsigned char, N> const& arr ) {
return to_string_helper<N>( arr.data() );
}
对于“整个缓冲区”的情况:
template<std::size_t N>
std::string to_string_2( std::array<unsigned char, N> const& arr ) {
const char* str = reinterpret_cast<const char*>(arr.data());
return std::string( str, str+N );
}
关于c++ - 如何将 tr1/array 转换为 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114556/