wee*_*eeo 4 c++ string casting
我不知道怎么投std::tr1::array<unsigned char, 16>的std::string?
编译器总是抱怨,我试过了
std::tr1::array<unsigned char, 16> sss;
string(sss);
string asd(sss);
Run Code Online (Sandbox Code Playgroud)
要么工作......
unsigned char使这个棘手.如果你知道你的系统使用二进制补码1个字节8位unsigned char和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;
}
Run Code Online (Sandbox Code Playgroud)
我包含了一些关于数组可能"满"并且缺少空终止符的可能性的偏执狂.
如果你真的想要所有16个unsigned char,即使有些是null,你也会想要使用它:
std::string str( arr.begin(), arr.end() );
Run Code Online (Sandbox Code Playgroud)
应该使用隐式转换unsigned char来char.
如果隐式转换没有做你想要的,并且你知道它array的内存实际上是一个数组,char即使它的类型是unsigned char,你需要做一些重新解释.
对于null终止的情况:
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() );
}
Run Code Online (Sandbox Code Playgroud)
而对于"整个缓冲区"的情况:
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 );
}
Run Code Online (Sandbox Code Playgroud)