如何在不使用reinterpret_cast的情况下将unsigned char转换为std::string?

17

我有一个unsigned char数组,需要转换为std::string,但是我当前的方法使用了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);

1
为什么您不喜欢使用reinterpret_cast呢? - egrunin
3
强制转换类型总是让人感觉像是一个hack,我宁愿使用原样的东西,而不是强制编译器将它们视为其他类型。 - WilliamKF
为什么不在 my_txt 中使用 char 呢?毕竟,你发布的这些值是 ASCii 码。这可能会有助于解决其他问题。 - Thomas Matthews
1
这是一个生成的文件,所以我宁愿不必再进一步处理它。 - WilliamKF
unsigned char*初始化一个string对我来说似乎很合理。我很惊讶有人反对不使用强制转换就想这样做。 - Kyle Strand
3个回答

19

使用迭代器构造函数:

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

假设您希望将无符号字符转换为字符。如果您想要重新解释它们,那么应该使用 reinterpret_cast。 这样非常干净,因为您所说的正是所做的事情。
不过,在您的示例中,这没有任何区别,因为数组中的所有值都在0到CHAR_MAX的范围内。所以可以保证这些值在char中和unsigned char中以相同方式表示,因此重新解释它们与将它们转换是相同的。 如果值大于CHAR_MAX,则允许实现以不同的方式处理它们。

将无符号字符转换为字符和将它们“解释”为字符有什么区别? - Alex Bitek
@BadDesign:在大多数实现中,这没有任何区别,但在不寻常的架构上可能会有一个区别。将大于CHAR_MAX的值转换为char的结果是实现定义的。重新解释的结果取决于类型的值表示,并不能保证与转换相同。 - Steve Jessop
嗨@史蒂夫,在将数组转换为字符串之前,是否需要在末尾添加0? - Noitidart
1
@Noitidart:不,string的迭代器构造函数会处理这个问题。 - Steve Jessop

7

你尝试过使用 sstream 吗?

     stringstream s;
     s << my_txt;

     string str_my_txt = s.str();

它对我来说很好用,不确定你为什么说它不起作用? - WilliamKF
2
结果证明我只是运气好,缺失的终止NULL在某些情况下会导致ABR。请参见相关问题:http://stackoverflow.com/questions/2889074/why-do-i-get-this-strange-output-behavior - WilliamKF

0
  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;
   }

2
尽管这段代码片段可能解决了问题,但包含一个解释会帮助提高您的帖子质量。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接