如何在C++中将unsigned char*转换为std :: string?

Uni*_*orn 36 c++ byte bytearray

我有unsigned char*,想把它转换成std::string.你能告诉我最安全的方法吗?

Yac*_*oby 59

您只需要将unsigned char转换为char,因为字符串类没有接受unsigned char的构造函数:

unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;
Run Code Online (Sandbox Code Playgroud)

但是,如果您的字节数组包含空值,则需要在构造函数中使用length参数,就好像您不只是部分数组将以字符串结尾(该数组最多为第一个null)

size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
Run Code Online (Sandbox Code Playgroud)

  • 作为一个可移植性的学习者,我想指出这只适用于具有2的补码算法的系统.在1的补码或符号量架构上,在`char*`和`unsigned char*`之间重新解释是不安全的(好吧,它是安全的,但是如果`char`被签名并且任何字符都会得到令人惊讶的结果设置最高位).在这种情况下,提问者显然是在Windows上,所以没问题. (4认同)

Cha*_*via 7

BYTE*可能是一个typedef unsigned char*,但我不能肯定.如果你告诉我们什么BYTE是有用的话会有所帮助.

如果BYTE*是unsigned char*,则可以使用std :: string范围构造函数将其转换为std :: string,这将使用两个通用迭代器.

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World");
int len = strlen(reinterpret_cast<const char*>(str1));
std::string str2(str1, str1 + len);
Run Code Online (Sandbox Code Playgroud)

话虽如此,你确定这是一个好主意吗?如果BYTEunsigned char它可能包含非ASCII字符,可以包括NULL.这将使得strlen长度不正确.


spo*_*son 5

BYTE *str1 = "Hello World";
std::string str2((char *)str1);  /* construct on the stack */
Run Code Online (Sandbox Code Playgroud)

或者:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */
cout << &str3;
delete str3;
Run Code Online (Sandbox Code Playgroud)

  • `std::string &amp;str3 = new ...`,您不是说 `*` 而不是 `&amp;` 吗?顺便说一句,在堆上创建 std::string 通常是个坏主意,并且破坏了具有值语义的字符串类的一半目的。 (4认同)