将unsigned char*转换为std::string

49

我在类型转换方面有点困惑。我有一个xmlChar*类型的字符串(即unsigned char*),我想将这个无符号字符转换为std::string类型。

xmlChar* name = "Some data";

我尽力进行类型转换,但是我找不到一种方法来转换它。


1
String 还是 std::string?如果你不是指 std::string,那么 String 是什么? - Mats Petersson
抱歉 @Mats Petersson,顺便说一下,它是 std::string。 - Cyril
使用reinterpret_cast请参阅此链接:https://dev59.com/JnRB5IYBdhLWcg3wUV1d - Ani
可能是const unsigned char * to std::string的重复问题。 - Mats Petersson
我能理解人们为什么想要将xmlChar声明为unsigned char。但令人遗憾的是,它与任何标准库都不能很好地配合使用:strlen()std::string都需要用到char类型。所以,如果你有任何影响力,请更改这一点。(而使用带符号的char来处理Latin-1仍然比使用char处理XML容易得多。) - James Kanze
2个回答

77
std::string sName(reinterpret_cast<char*>(name));

reinterpret_cast<char*>(name)以不安全的方式将unsigned char*转换为char*,但这是应该在此处使用的方法。然后调用std::string的普通构造函数。

您也可以使用 C 风格完成(不建议使用):

std::string sName((char*) name);

1
我发现在某些情况下,reinterpret_cast 会在末尾产生一些垃圾字符。由于它们很容易被截断,所以我没有深入调查,但我想提一下,以防我不是唯一遇到这个问题的人。 - MatrixManAtYrService
1
不是一个人,我也遇到了这个问题。 - audiFanatic
1
你可能看到了垃圾数据,因为你的无符号字符数组没有以空终止符(或者没有在你认为的位置上以空终止符结尾)。通常情况下,仅仅从一种类型强制转换为字符串类型而不考虑NUL是很危险的。如果你的代码与OP的示例有任何不同(字符串字面量已经有空终止符),你应该仔细思考这个问题。 - David Roberts
6
根据这个答案:https://dev59.com/5nI-5IYBdhLWcg3wy7sd#1673536,如果你预先知道字符串的大小,那么可以避免一些问题: std::string sName(reinterpret_cast<char*>(name), name_len); - dkurzaj

-1

我认为被接受的解决方案有点冒险,而且说实话并不是很好。我认为更好的解决方案是使用std::to_string

unsinged char char1{192};
auto result = std::to_string(char1)

现在char1等于std::string("192")


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