【问题标题】:Way to get unsigned char into a std::string without reinterpret_cast?在没有 reinterpret_cast 的情况下将 unsigned char 转换为 std::string 的方法?
【发布时间】:2011-02-19 21:57:46
【问题描述】:

我在 std::string 中有一个我需要的 unsigned char 数组,但我目前的方式使用我想避免的 reinterpret_cast。有没有更清洁的方法来做到这一点?

unsigned char my_txt[] = {
  0x52, 0x5f, 0x73, 0x68, 0x7e, 0x29, 0x33, 0x74, 0x74, 0x73, 0x72, 0x55
}
unsigned int my_txt_len = 12;

std::string my_std_string(reinterpret_cast<const char *>(my_txt), my_txt_len);

【问题讨论】:

  • 你为什么不喜欢reinterpret_cast...?
  • 强制强制转换似乎总是一种技巧,我宁愿按原样使用东西,而不是强迫编译器将它们视为其他东西。
  • 为什么不使用char 代替my_txt;毕竟,您发布的那些值是 ASCII。这可能会导致解决其他问题。
  • 这是一个生成的文件,所以我宁愿不必进一步处理它。
  • unsigned char* 初始化string 对我来说似乎很合理。我很惊讶有人反对在不使用演员表的情况下这样做。

标签: c++ stdstring reinterpret-cast


【解决方案1】:
  int _tmain(int argc, _TCHAR* argv[])
  {
        unsigned char temp  = 200;
        char temp1[4];

        sprintf(temp1, "%d", temp);

        std::string strtemp(temp1);

        std::cout<<strtemp.c_str()<<std::endl;

        return 0;
   }

【讨论】:

  • 虽然此代码 sn-p 可以解决问题,包括解释 really helps 以提高您的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
【解决方案2】:

使用迭代器构造函数:

std::string my_std_string(my_txt, my_txt + my_txt_len);

这是假设您希望将无符号字符转换为字符。如果您想要重新解释它们,那么您应该使用reinterpret_cast。那将是完全干净的,因为您所说的正是所做的。

但是,在您的示例中,它没有任何区别,因为您数组中的所有值都在0CHAR_MAX 的范围内。因此可以保证这些值在char 中的表示方式与它们在unsigned char 中的表示方式相同,因此重新解释它们与转换它们相同。如果您的值大于CHAR_MAX,则允许实现以不同方式对待它们。

【讨论】:

  • 将 unsigned char 转换为 char 和将它们“解释”为 char 之间有什么区别?
  • @BadDesign:在大多数实现上没有区别,但在不寻常的架构上可能会有。将大于 CHAR_MAX 的值转换为 char 的结果是实现定义的。重新解释的结果取决于类型的值表示,不保证与转换相同。
  • 嗨@steve 数组在生成字符串之前是否需要尾随0?
  • @Noitidart: 不,string 的迭代器构造函数会处理这个问题。
【解决方案3】:

你试过sstream吗?

     stringstream s;
     s << my_txt;

     string str_my_txt = s.str();

【讨论】:

  • 对我来说效果很好,不知道你为什么说它不起作用?
  • 原来我只是走运了,在某些情况下缺少终止 NULL 会导致 ABR。在此处查看相关问题:stackoverflow.com/questions/2889074/…
猜你喜欢
  • 2013-07-18
  • 1970-01-01
  • 2011-07-23
  • 2021-11-05
  • 2012-11-04
  • 1970-01-01
  • 2013-01-19
  • 2022-12-15
  • 1970-01-01
相关资源
最近更新 更多