我有一个 unsigned char*
,想要将其转换为 std::string
。请问您能告诉我最安全的方法是什么吗?
你只需要将 unsigned char
强制转换为 char
,因为 string
类没有接受 unsigned char
的构造函数:
unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;
如果您的字节数组包含空值(nulls),则需要在构造函数中使用length参数,否则只有数组中第一个空值前面的部分会出现在字符串中。
size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
char*
和 unsigned char*
之间的转换是不安全的(嗯,它是安全的,但如果 char
是有符号的且任何字符的最高位设置了,你将会得到令人惊讶的结果)。在这种情况下,提问者显然在使用Windows,所以没有问题。 - Steve JessopBYTE*
可能是 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
给出不正确的长度。
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;
std::string
没有一个以unsigned char*
为参数的构造函数,所以编译器会退而求其次使用为分配器设计的模板化构造函数。你需要使用std::string(Iterator begin, Iterator end)
或者std::string(const char*, std::size_t n)
,并将BYTE强制转换为char。 - Charles Salvia*
而不是 &
?顺便说一下,在堆上创建 std::string 通常是一个坏主意,这样做违背了具有值语义的字符串类的一半作用。 - sbkBYTE就是typedef unsigned char BYTE;
您可以轻松地使用以下任何构造函数
string ( const char * s, size_t n );
string ( const char * s );
#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;
}
如果有访问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
Byte
类型呢?更重要的是,你的指针指向什么?是一个单独的Byte
值还是一个Byte
数组?在你的字符串中,你想要表示指针的值的文本表示形式,还是表示所指向的对象/对象们的值的字符串? - CB Bailey