У меня unsigned char*
, вы хотите преобразовать его в std::string
. Не могли бы вы рассказать мне о самом безопасном способе сделать это?
Как преобразовать unsigned char * в std::string в С++?
Ответ 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