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++?
Antwort
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) ;
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
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. –
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;
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
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 * –
' 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
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 BYTE
unsigned char
ist, kann es Nicht-ASCII-Zeichen enthalten, die NULL enthalten können. Dies wird strlen
eine falsche Länge geben.
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);
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
C++ nicht über einen Byte-Typen, so benötigen Sie uns zu sagen, was der Typ eigentlich ist. – Yacoby
BYTE löst in "unsigned char" – Unicorn
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? –