verschiedene daten aus vector<char> auslesen
-
Hi,
ich habe einen vector<char> in welchem verschiedene daten stecken... an den ersten 4 stellen zum beispiel ein int, an den nächsten 4 stellen ein float etc.
Meine Frage:
Wie kann ich nun elegant diese daten aus dem vector extrahieren bzw wie würdet ihr das machen?
-
int value = *static_cast<int*>(&vec[0]);Wobei int der Typ und 0 der offset ist.
-
Bequeme Methode:
stringstream lesestream(string(dein_vector.begin(), dein_vector.end()));Und dann wie gewohnt fortfahren.
Performancemethode, um mit viel Code eine einzelne Kopie zu sparen: Man könnte sich einen streambuf schreiben, der direkt auf deinem vector operiert.
edit: Ach, ich habe dich falsch verstanden. Ich dachte in dem vector stünde tatsächlich so etwas wie '1''2''3' und du wolltest den Wert 123 erhalten.
-
Hi,
du meinst reinterpret_cast oder?
Hmm, hab mal gehört, dass man den vermeiden soll... frag mich aber nicht warum?
-
tr0n schrieb:
du meinst reinterpret_cast oder?
Hmm, hab mal gehört, dass man den vermeiden soll... frag mich aber nicht warum?
Nein ich meine static_cast.
Und ja, reinterpret_cast sollte man vermeiden.
Und auch das Konstrukt von mir hier sollte man nur in Situationen einsetzen wo man weiss dass es OK ist.
-
@Shade Of Mine
Postest du absichtlich Code der plattformabhängig, und im allgemeinen kein korrektes C++ ist (Alignment etc.)?Und... wenn du static_cast meinst, dann meinst du falsch. Mit static_cast kannst du nen char* nicht in einen int* verwandeln. Nicht ohne Umweg über void* zumindest.
------------
@tr0n
Korrekterweise macht man das mit memcpy.vector<char> data ... // deine Daten size_t offset ... // der Offset wo du nen int lesen willst int i; memcpy(&i, &data[offset], sizeof(int));
-
hustbaer schrieb:
@Shade Of Mine
Postest du absichtlich Code der plattformabhängig, und im allgemeinen kein korrektes C++ ist (Alignment etc.)?Wenn du die Daten direkt als Bytestream hast, dann bist du schon Plattformabhaengig.
Und... wenn du static_cast meinst, dann meinst du falsch. Mit static_cast kannst du nen char* nicht in einen int* verwandeln. Nicht ohne Umweg über void* zumindest.
Argh, da war ja was. Mein fehler

Aber inwiefern ist es mit memcpy besser?
-
Was die Darstellung von Integers im Speicher angeht bleibt der Code plattformabhängig, da hast du Recht.
Mit memcpy ist es aber wenigstens OK was Alignment angeht. D.h. es gibt kein UB mehr auf Plattformen wo z.B. ein int immer auf durch 4 teilbaren Adressen stehen muss.
D.h. die memcpy Variante wird immer ohne UB laufen, aber u.U. nicht den gewünschten Wert im Integer erzeugen.
----
Wenn man 100% portierbaren Code haben möchte, dann müsste man hier (wesentlich) mehr Aufwand treiben. U.a. ist ja nicht gesagt dass ein char immer 8 Bit hat und ein int immer 32 uswusf. - da bekommt man ganz schnell ganz viel Code zusammen für so ne einfache Sache wie "lies mir mal nen int aus nem Bytestream".