Подтвердить что ты не робот

Как преобразовать unsigned char * в std::string в С++?

У меня unsigned char*, вы хотите преобразовать его в std::string. Не могли бы вы рассказать мне о самом безопасном способе сделать это?

4b9b3361

Ответ 1

Вам просто нужно преобразовать 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 ) ;

Ответ 2

BYTE*, вероятно, является typedef для unsigned char*, но я не могу сказать точно. Это поможет, если вы сообщите нам, что BYTE.

Если BYTE * без знака 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.

Ответ 3

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;

Ответ 4

BYTE - это не что иное, как typedef unsigned char BYTE;

Вы можете легко использовать любой из ниже конструкторов

string ( const char * s, size_t n );
string ( const char * s );

Ответ 5

Если имеет доступ к CryptoPP

Считываемая шестнадцатеричная строка без знака char

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