2010-05-15 62 views
17

我有一个unsigned char数组,我需要一个std :: string,但我目前的方式使用reinterpret_cast,我想避免。有没有更干净的方法来做到这一点?如何将unsigned char转换为不带reinterpret_cast的std :: string?

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 2010-05-15 16:40:59

+3

对于强制演员来说,它总是看起来像是黑客,我宁愿按照现状使用,而不是强迫编译器把它们当作别的东西。 – WilliamKF 2010-05-15 17:43:01

+0

为什么不用'char'作为'my_txt';毕竟,你发布的这些值是ASCii。这可能会导致解决其他问题。 – 2010-05-15 19:04:26

回答

19

使用迭代器的构造函数:

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

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

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

+0

无符号字符被转换为字符和他们被'解释'之间的区别是什么?作为字符? – bitek 2013-04-01 12:08:44

+0

@BadDesign:在大多数实现中,它没有区别,但是在不寻常的架构上可能会有一个。将大于'CHAR_MAX'的值转换为char的结果是实现定义的。重新解释的结果取决于类型的值表示,并不保证与转换相同。 – 2013-04-01 23:10:00

+0

嗨@steve数组在创建一个字符串之前是否需要一个尾部0? – Noitidart 2017-02-22 22:30:01

7

你试过sstream吗?

 stringstream s; 
    s << my_txt; 

    string str_my_txt = s.str(); 
+0

它对我很好,不知道为什么你说它不起作用? – WilliamKF 2010-05-15 16:43:35

+0

是的 - 你很对!在那里有一个理由失败的原因! – 2010-05-15 16:47:36

+2

原来我只是很幸运,在某些情况下,终止NULL的缺失会导致ABR。在这里看到相关的问题:http://stackoverflow.com/questions/2889074/why-do-i-get-this-strange-output-behavior – WilliamKF 2010-05-22 18:11:00

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

尽管此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 – 2016-11-11 10:56:36

相关问题