如何将tr1 / array转换为std :: string?

时间:2013-06-14 17:57:49

标签: c++ string casting

我想知道如何将std::tr1::array<unsigned char, 16>投射到std::string

编译器总是抱怨,我试过

std::tr1::array<unsigned char, 16> sss;
string(sss);
string asd(sss);

要么工作......

2 个答案:

答案 0 :(得分:5)

unsigned char让这很棘手。如果您知道您的系统使用2s补充1字节8位unsigned charchar,则从unsigned charchar的隐式转换可以达到您想要的效果(这些并非总是如此) !),你的数组缓冲区为空终止(即第一个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,即使有些是null,你也会想要使用它:

std::string str( arr.begin(), arr.end() );

应该使用从unsigned charchar的隐式转换。

如果隐式转换不能达到你想要的效果,并且你知道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 );
}

答案 1 :(得分:2)

为了清楚起见,你知道这个演员是一个复制转换,对吗?

// 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()代替。

如果你确定将char解释为有意义的话,你可以将它推广到任何类型的数组:

// 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));
}