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

标签 c++ string casting

我想知道如何投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 charchar,以及从 unsigned charchar 的隐式转换 做你想做的(这些并不总是正确的!),并且你的数组缓冲区是 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 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 );
}

关于c++ - 如何将 tr1/array 转换为 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114556/

相关文章:

java - 允许我正确运行使用 cin 的 C++ 代码的网站?

c - 该程序适用于小数据输入,但在输入大字符串时会出现运行时错误..?为什么..?

c++ - 无法在我的代码中计算出 char* 字符串

string - 由于字符串中的 unicode 字符导致应用程序崩溃

sql - 将数值转换为 VARCHAR2 会引发 ORA-03113

c++ - 如何使用 WinAPI(不是 WMI)枚举系统还原点?

C++向下转换以撤消函数覆盖

C++:BOOST-ASIO read_handler() 没有按预期工作?

c++ - 在 C++ 类型转换期间自动舍入 a

mysql - 将 CAST() 与 MAX()/MIN() 结合使用