2009-11-04 17 views
30

Ho unsigned char*, voglio convertirlo in std::string. Puoi dirmi per favore il modo più sicuro per farlo?Come convertire il char unsigned * in std :: string in C++?

+3

C++ non ha un tipo di byte, quindi è necessario dirci che il tipo è in realtà. – Yacoby

+1

BYTE risolve in "char unsigned" – Unicorn

+3

E per quanto riguarda 'Byte'? E, cosa più importante, a cosa punta il puntatore? Un singolo valore 'Byte' o un array di' Byte'? Cosa vuoi nella tua stringa: una rappresentazione testuale del valore del puntatore o della stringa che rappresenta i valori degli oggetti puntati? –

risposta

48

Hai solo bisogno di lanciare l'unsigned char in un char come la classe String non ha un costruttore che accetta unsigned char:

unsigned char* uc; 
std::string s(reinterpret_cast< char const* >(uc)) ; 

Tuttavia, sarà necessario utilizzare l'argomento di lunghezza nel costruttore se la matrice di byte contiene null, come se yo u non solo una parte della matrice finiranno nella stringa (la matrice fino al primo nullo)

size_t len; 
unsigned char* uc; 
std::string s(reinterpret_cast<char const*>(uc), len) ; 
+0

BYTE * pbData = "SomeString" size_t length = 10 Ho la lunghezza prima della mano, quindi ho usato questo: I usato questo metodo, "std :: string (reinterpret_cast (pbData), lunghezza);" Funziona, ma una volta mentre vedo crash in memcpy. Tryint per trovare il nostro perché è successo un incidente, anche se sembra funzionare per me – Unicorn

+3

Come pedante della portabilità, voglio sottolineare che questo funziona solo su sistemi con aritmetica del complemento a 2. Sulle architetture complementari o di magnitudine dei segni di 1, non è sicuro reinterpret_cast tra 'char *' e 'unsigned char *' (beh, è ​​sicuro, ma otterrai risultati sorprendenti se 'char' è firmato e uno qualsiasi dei caratteri avere il bit più alto impostato). In questo caso l'interrogante è ovviamente su Windows, quindi nessun problema. –

3
BYTE *str1 = "Hello World"; 
std::string str2((char *)str1); /* construct on the stack */ 

alternativa:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */ 
cout << &str3; 
delete str3; 
+0

Non funziona, viene visualizzato un messaggio di errore "'std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: allocator <_Ty> &)': impossibile convertire il parametro 1 da 'BYTE *' a 'const std :: allocator <_Ty> & '" – Unicorn

+1

Ciò è dovuto al fatto che' std :: string' non ha un costruttore che accetta un 'char senza segno'', e quindi il compilatore ricade sul costruttore temporizzato pensato per gli allocatori. È necessario utilizzare 'std :: string (Iterator begin, Iterator end)', o 'std :: string (const char *, std :: size_t n)' e trasmettere il BYTE * a un char * –

+4

'std: : string & str3 = new ... ', non intendevi' * 'invece di' & '? E btw, la creazione di std :: string sull'heap è in genere una cattiva idea e sconfigge metà dello scopo di avere una classe stringa con semantica del valore. – sbk

5

BYTE* è probabilmente un typedef per unsigned char*, ma non posso dirlo con certezza. Sarebbe utile se tu ci dica cosa è BYTE.

Se BYTE * è un carattere non firmato *, è possibile convertirlo in una stringa std :: utilizzando il costruttore di intervallo std :: string, che prenderà due Iterator generici.

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World"); 
int len = strlen(reinterpret_cast<const char*>(str1)); 
std::string str2(str1, str1 + len); 

Detto questo, sei sicuro che sia una buona idea? Se BYTE è unsigned char, può contenere caratteri non ASCII, che possono includere valori NULL. Ciò renderà strlen una lunghezza errata.

2

BYTE è altro che typedef unsigned char BYTE;

Si può facilmente utilizzare uno qualsiasi dei costruttori di sotto

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

Se ha accesso al cryptopp

leggibile Hex String a char unsigned

std::string& hexed = "C23412341324AB"; 
uint8_t  buffer[64] = {0}; 
StringSource ssk(hexed, true, 
      new HexDecoder(new ArraySink(buffer,sizeof(buffer)))); 

E torna

std::string hexed; 
uint8_t val[32] = {0}; 
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed)); 
// val == buffer 
Problemi correlati