我想知道如何转换std::tr1::array<unsigned char, 16>
为 a std::string
?
编译器总是抱怨,我试过
std::tr1::array<unsigned char, 16> sss;
string(sss);
string asd(sss);
要么工作......
unsigned char
让这很棘手。如果您知道您的系统使用 2s 补码 1 字节 8 位unsigned char
和,并且从to 的char
隐式转换可以满足您的要求(这些并不总是正确的!),并且您的数组缓冲区是空终止的(即,第一个之后的字符应该是丢弃),此功能有效:unsigned char
char
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
应该使用从to的隐式转换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 );
}
为了清楚起见,你知道这个演员表是复制转换,对吧?
// if you want the whole fixed-size string including any nul characters
template <std::size_t N>
std::string fixed_array_to_string(std::tr1::array<unsigned char, N> const &array)
{
return std::string(reinterpret_cast<const char *>(&*array.begin()), N);
}
// if your array is nul-terminated
template <std::size_t N>
std::string nul_array_to_string(std::tr1::array<unsigned char, N> const &array)
{
return std::string(reinterpret_cast<const char *>(&*array.begin()));
}
这&*
东西很丑,可以用&array.front()
.
如果您确定将其解释为 achar
有意义,则可以将其推广到任何类型的数组:
// if you want the whole fixed-size string including any nul characters
template <typename T, std::size_t N>
std::string fixed_array_to_string(std::tr1::array<T, N> const &array)
{
return std::string(reinterpret_cast<const char *>(&*array.begin()),
N * sizeof(T));
}