我有unsigned char*
,希望将其转换为std::string
。你能告诉我最安全的方法吗?
答案 0 :(得分:53)
你只需要将unsigned char转换为char,因为字符串类没有接受unsigned char的构造函数:
unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;
但是,如果你的字节数组包含空值,你将需要在构造函数中使用length参数,就好像你不只是部分数组将以字符串结尾(数组直到第一个空)< / p>
size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
答案 1 :(得分:6)
BYTE*
可能是unsigned char*
的typedef,但我不能肯定地说。如果您告诉我们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);
话虽如此,你确定这是一个好主意吗?如果BYTE
为unsigned char
,则它可能包含非ASCII字符,其中可能包含NULL。这将使strlen
给出不正确的长度。
答案 2 :(得分:4)
BYTE *str1 = "Hello World";
std::string str2((char *)str1); /* construct on the stack */
可替换地:
std::string *str3 = new std::string((char *)str1); /* construct on the heap */
cout << &str3;
delete str3;
答案 3 :(得分:2)
BYTE只是typedef unsigned char BYTE;
您可以轻松使用以下任何构造函数
string ( const char * s, size_t n );
string ( const char * s );
答案 4 :(得分:1)
这是完整的代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned char BYTE;
int main() {
//method 1;
std::vector<BYTE> data = {'H','E','L','L','O','1','2','3'};
//string constructor accepts only const char
std::string s((const char*)&(data[0]), data.size());
std::cout << s << std::endl;
//method 2
std::string s2(data.begin(),data.end());
std::cout << s2 << std::endl;
//method 3
std::string s3(reinterpret_cast<char const*>(&data[0]), data.size()) ;
std::cout << s3 << std::endl;
return 0;
}
答案 5 :(得分:0)
如果可以访问CryptoPP
可读的十六进制字符串到无符号字符
std::string& hexed = "C23412341324AB";
uint8_t buffer[64] = {0};
StringSource ssk(hexed, true,
new HexDecoder(new ArraySink(buffer,sizeof(buffer))));
然后回来
std::string hexed;
uint8_t val[32] = {0};
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed));
// val == buffer