Принятый ответ не будет работать из-за проблемы, описанной здесь https://wpf.2000things.com/2011/04/17/279-adding-a-border-around-an-image-control/
Я решил это таким образом.
Вам просто нужно было преобразовать unsigned char
в char
, так как класс string
не имеет конструктора, который принимает unsigned char
:
unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;
Однако вам нужно будет использовать аргумент длины в конструкторе, если ваш массив байтов содержит нули, как будто вы этого не сделаете, только часть массива окажется в строка (массив до первого нуля)
size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
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);
При этом вы уверены, что это хорошая идея? Если BYTE
равен unsigned char
, он может содержать символы, отличные от ASCII, которые могут включать NULL. Это приведет к тому, что strlen
будет давать неверную длину.
BYTE - это не что иное, как typedef unsigned char BYTE;
Вы можете легко использовать любой из конструкторов ниже
string ( const char * s, size_t n );
string ( const char * s );
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;