2015-09-25 20 views
5

Ich habe Std :: String-Variable. Und ich muss einige Bytes aus dem Array von unsignierten Zeichen dazu setzen. Ich kenne das erste Byte und das Bein.Setzen Sie Bytes von unsigned Char-Array zu std :: string mit memcpy() -Funktion

ich die std verwenden können :: string :: assign Funktion. Ich habe es getan.

Aber ich will diese Frage in einem richtigen Weg Funktion mit dem Memcpy lösen.

std::string newString; 
memcpy(&newString, &bytes[startIndex], length); 

Ich weiß, dass es falsch ist. Ich habe recherchiert und einige Ideen mit std :: vector gefunden.

Bitte mir helfen, die eleganteste Lösung für dieses Problem zu finden.

+4

Warum denkst du, assign() 'ist nicht der" richtige Weg "? – Barry

+0

"in der richtigen Weise" ist "Ich weiß, es ist falsch" =? – crashmstr

+0

@Barry Ich möchte es auf zwei verschiedene Arten lösen. Ich lerne C++ Sprache. Und das Finden dieser Lösung ist für mich interessant :) –

Antwort

11

Da wir die Konstruktion nur die stri ng gibt es einen std::string Konstruktor, der zwei Iteratoren nimmt:

template< class InputIt > 
basic_string(InputIt first, InputIt last, 
       const Allocator& alloc = Allocator()); 

, die wir zur Verfügung stellen können:

std::string newString(&bytes[startIndex], &bytes[startIndex] + length); 

Wenn wir nicht die Zeichenfolge Konstruktion und stattdessen die Zuordnung zu einer bestehenden sind, sollten Sie bevorzugen Sie immer noch assign() zu verwenden. Das ist genau das, was diese Funktion ist für:

oldString.assign(&bytes[startIndex], &bytes[startIndex] + length); 

Aber wenn Sie wirklich auf memcpy() aus irgendeinem Grunde zu bestehen, dann müssen Sie sicherstellen, dass die Zeichenfolge tatsächlich genügend Daten in kopiert werden. Und dann kopieren Sie einfach mit &str[0] als Zieladresse & dagger;:

oldString.resize(length); // make sure we have enough space! 
memcpy(&oldString[0], &bytes[startIndex], length); 

& Dolch; Pre-C++ 11 es gibt technisch keine Garantie, dass Strings zusammenhängend im Speicher abgelegt werden, obwohl dies in der Praxis ohnehin der Fall war.

+1

Warum der Downvote? – Barry

+0

IDK. sieht aus wie jemand mochte keine der Antworten – NathanOliver

+0

Ich denke '& Bytes [startIndex + Länge]' wäre mehr konsistent mit dem, was Sie haben (keine Programmierer-Zeigerarithmetik durchgeführt). Aber es gibt auch die Zeichenkette ctor, die ein 'const char *' und eine Länge: 'std :: string newString (& bytes [startIndex], length);' –

-1

Sie müssen die Größe der Zeichenfolge setzen, so dass es ein ausreichend dimensionierten Puffer sein, die Daten zu empfangen, und werfen die Konstantheit aus dem Zeiger Sie erhalten data()

std::string newString; 
newString.resize(length); 
memcpy((char*)newString.data(), &bytes[startIndex], length); 

natürlich alle Dies ist im Bereich des undefinierten Verhaltens, aber nicht weniger schön.

+0

In '& newString'? – Barry

+0

Sie haben Recht, behoben – shoosh

-3

Es ist ein Hack und wie Sie falsch gesagt, aber es ist möglich, da STL garantiert, dass std::string sequenziellen Speicher hat:

std::string str(32, '\0'); 
std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY"); 

Natürlich können Sie std::memcpy auf die gleiche Art und Weise verwenden können (I verwendet strcpy nur Kopie nullterminierten String) ...

In Ihrem Fall:

str.resize(length); 
memcpy(const_cast<char*>(str.data()), bytes + startIndex, length); 
+0

Und wenn die Zeichenfolge, die Sie kopieren, mehr als 32 Bytes hat? – Barry

+0

Natürlich sollten Sie gut passen String (achten Sie darauf, 'resize()' nicht 'reserve()'!) – Nevermore

+2

um zu klären, was Nevermore durch "illegaler Weg" bedeutet: [* Ändern der Character-Array durch Daten zugegriffen ist undefiniertes Verhalten *] (http://en.cppreference.com/w/cpp/string/basic_string/data). Tun Sie dies nicht –