2009-11-04 3 views
30

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

+3

C++ не имеет тип байт, так что вы должны сказать нам, что тип на самом деле. – Yacoby

+1

BYTE разрешает «unsigned char» – Unicorn

+3

А как насчет 'Byte'? И что еще более важно, на что указывает указатель? Единственное значение 'Byte' или массив' Byte'? Что вы хотите в своей строке: текстовое представление значения указателя или строки, которая представляет значения объекта (ов), на которые указывает? –

ответ

48

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

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) ; 
+0

BYTE * pbData = "SomeString" size_t length = 10 У меня есть длина перед рукой, поэтому я использовал это: I использовал этот метод: "std :: string (reinterpret_cast (pbData), length);" Это работает, но один раз в то время, когда я вижу крушение в memcpy. Попробуйте найти, почему произошел сбой, хотя, похоже, он работает для меня – Unicorn

+3

Как педантский переносимость, хочу отметить, что это работает только в системах с арифметикой дополнений 2. В архитектуре дополнения или знаковой величины 1 небезопасно reinterpret_cast между символами 'char *' и 'unsigned char *' (ну, это безопасно, но вы получите удивительные результаты, если 'char' будет подписан и любой из символов установить верхний бит). В этом случае вопросник, очевидно, находится в Windows, поэтому проблем нет. –

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; 
+0

Это не работает, я получаю сообщение об ошибке «'std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: allocator <_Ty> &)': не может преобразовать параметр 1 из 'BYTE *' в 'const std :: allocator <_Ty> & '" – Unicorn

+1

Это потому, что' std :: string' не имеет конструктора, который принимает 'unsigned char *', и поэтому компилятор возвращается к шаблону-конструктору, предназначенному для распределителей. Вам нужно либо использовать 'std :: string (Iterator begin, Iterator end)', либо 'std :: string (const char *, std :: size_t n)' и передать BYTE * в char * –

+4

'std: : string & str3 = new ... ', разве вы не имели в виду' * 'вместо' & '? И btw, создавая std :: string в куче, обычно плохая идея и портит половину цели создания класса string со значениями семантики. – sbk

5

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.

2

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

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

string (const char * s, size_t n); 
string (const char * s); 
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 

 Смежные вопросы

  • Нет связанных вопросов^_^