2009-11-04 5 views
30

Ich habe unsigned char*, möchte es in std::string konvertieren. Können Sie mir bitte den sichersten Weg sagen, dies zu tun?Wie konvertiert man unsigned char * zu std :: string in C++?

+3

C++ nicht über einen Byte-Typen, so benötigen Sie uns zu sagen, was der Typ eigentlich ist. – Yacoby

+1

BYTE löst in "unsigned char" – Unicorn

+3

Und was ist mit 'Byte'? Und was noch wichtiger ist, worauf zeigen Sie Zeiger? Ein einzelner 'Byte'-Wert oder ein Array von' Byte'? Was möchten Sie in Ihrer Zeichenfolge: eine textuelle Darstellung des Werts des Zeigers oder der Zeichenfolge, die die Werte der Objekte darstellt, auf die gezeigt wird? –

Antwort

48

Sie nur notwendig, um die unsigned char in einen char zu werfen als die String-Klasse keinen Konstruktor haben, dass akzeptiert unsigned char:

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

Allerdings müssen Sie die Länge Argument im Konstruktor verwenden, wenn Ihr Byte-Array Nullen enthält, als ob yo u nicht nur ein Teil des Arrays werden in der Zeichenfolge (das Array bis zum ersten null) am Ende

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

BYTE * pbData = "SomeString" size_t length = 10 Ich habe die Länge vor der Hand, also habe ich diese verwendet: I benutzte diese Methode, "std :: string (reinterpret_cast (pbData), Länge);" Es funktioniert, aber einmal in der Zeit sehe ich Crash in Memcpy. Versuchen zu finden, warum Absturz passiert ist, obwohl es scheint für mich arbeiten – Unicorn

+3

Als Portabilität Pedant, möchte ich darauf hinweisen, dass dies nur auf Systemen mit 2-Komplement-Arithmetik funktioniert. Auf 1-Komplement- oder Zeichen-Magnitude-Architekturen ist es nicht sicher, zwischen "char *" und "unsigned char *" uminterpretieren_ (gut, es ist sicher, aber Sie werden überraschende Ergebnisse erhalten, wenn "char" signiert ist und eines der Zeichen habe das obere Bit gesetzt). In diesem Fall ist der Fragesteller offensichtlich auf Windows, also kein Problem. –

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

Alternativ:

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

Es funktioniert nicht, ich bekomme eine Fehlermeldung "'std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: Zuweiser <_Ty> &)': kann Parameter 1 von 'BYTE *' nicht in 'const std :: allocator <_Ty> & '" – Unicorn

+1

Das liegt daran, dass' std :: string' keinen Konstruktor hat, der ein 'unsigned char *' akzeptiert, und der Compiler greift daher auf den templated Konstruktor zurück, der für Zuweiser gedacht ist. Sie müssen entweder 'std :: string (Iterator begin, Iterator end) 'oder' std :: string (const char *, std :: size_t n) 'verwenden und das BYTE * in ein char * –

+4

' std: : string & str3 = new ... ', meinst du nicht' '' '' '' '? Und übrigens, erstellen std :: string auf dem Heap ist in der Regel schlechte Idee und vereitelt die Hälfte der Zweck einer String-Klasse mit Wert Semantik. – sbk

5

BYTE* ist wahrscheinlich ein typedef für unsigned char*, aber ich kann nicht sicher sagen. Es würde helfen, wenn Sie uns sagen, was BYTE ist.

Wenn BYTE * unsigned char * ist, können Sie es in eine std :: string konvertieren, indem Sie den std :: string range -Konstruktor verwenden, der zwei generische Iteratoren benötigt.

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

Das gesagt, sind Sie sicher, dass dies eine gute Idee ist? Wenn BYTEunsigned char ist, kann es Nicht-ASCII-Zeichen enthalten, die NULL enthalten können. Dies wird strlen eine falsche Länge geben.

2

BYTE ist nichts anderes als typedef unsigned char BYTE;

Sie einfach alle unter Konstrukteure verwenden können

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

Wenn hat Zugriff auf CryptoPP

Lesbare Hex String zu unsigned char

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

Und zurück

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