У меня есть unsigned char*
, хочу, чтобы преобразовать его в std::string
. Не могли бы вы рассказать мне о самом безопасном способе сделать это?Как преобразовать unsigned char * в std :: string в C++?
ответ
Вам просто нужно бросить неподписанный символ в полукокс как класс строки не имеет конструктора, принимает символ без знака:
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 * pbData = "SomeString" size_t length = 10 У меня есть длина перед рукой, поэтому я использовал это: I использовал этот метод: "std :: string (reinterpret_cast
Как педантский переносимость, хочу отметить, что это работает только в системах с арифметикой дополнений 2. В архитектуре дополнения или знаковой величины 1 небезопасно reinterpret_cast между символами 'char *' и 'unsigned char *' (ну, это безопасно, но вы получите удивительные результаты, если 'char' будет подписан и любой из символов установить верхний бит). В этом случае вопросник, очевидно, находится в Windows, поэтому проблем нет. –
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 :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: allocator <_Ty> &)': не может преобразовать параметр 1 из 'BYTE *' в 'const std :: allocator <_Ty> & '" – Unicorn
Это потому, что' std :: string' не имеет конструктора, который принимает 'unsigned char *', и поэтому компилятор возвращается к шаблону-конструктору, предназначенному для распределителей. Вам нужно либо использовать 'std :: string (Iterator begin, Iterator end)', либо 'std :: string (const char *, std :: size_t n)' и передать BYTE * в char * –
'std: : string & str3 = new ... ', разве вы не имели в виду' * 'вместо' & '? И btw, создавая std :: string в куче, обычно плохая идея и портит половину цели создания класса string со значениями семантики. – sbk
BYTE*
, вероятно, ЬурейеЕ для unsigned char*
, но я не могу сказать наверняка. Это поможет, если вы сообщите нам, что такое BYTE
.
Если BYTE * is unsigned char *, вы можете преобразовать его в std :: string, используя конструктор std :: string range, который примет два родовых итератора.
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);
Если есть доступ к 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
C++ не имеет тип байт, так что вы должны сказать нам, что тип на самом деле. – Yacoby
BYTE разрешает «unsigned char» – Unicorn
А как насчет 'Byte'? И что еще более важно, на что указывает указатель? Единственное значение 'Byte' или массив' Byte'? Что вы хотите в своей строке: текстовое представление значения указателя или строки, которая представляет значения объекта (ов), на которые указывает? –