struct in string kopieren
-
Also...
ich habe ein Stuct :
struct MSGHeader { unsigned int Version; unsigned int Type; unsigned int Len; };Wie man sieht ist das ein Header für eine Nachricht, die Nachricht ist ein String. so ich will jetzt dieses Struct (bzw. die bytes dieses Structs) an den Anfang des strings packe (an der gegenstelle wird das ganze dann wieder andersrum gemacht).
Aber ich bekomme es einfach nicht hin:
Stringstream nimmt mein struct nicht weil es ja ein eigener Typ ist.... wie stelle ich das jetzt am besten an?
Bin für jede Hilfe dankbar
-
Hi,
string ToString(int val) { ostringstream ss; ss << val; return ss.str(); } struct MSGHeader { unsigned int Version; unsigned int Type; unsigned int Len; }; MSGHeader& operator>> (const MSGHeader& header, string& str) { str = ToString(header.Version) + " " + ToString(header.Type) + " " + ToString(header.Len); return header; } // ... MSGHeader h; // fill h h >> mystring;Hoffe mal das meintest du ...
-
ähm... jein.. es ist ne möglcihkeit.
Allerdings hab ich ja indirekt das gemacht was ich nicht ganz wollte, die zahlen zu phrasen und als zahlen in den string zu schreiben..
was ich eigentlich dachte wäre das struct als datenmasse zu sehen (bytes) die einfach in dem string abgelegt werden. Sprich quasi unverändert...
-
so vielleicht:
std::string s(reinterpret_cast<char*>(&msgheader), sizeof(msgheader));
-
codec schrieb:
so vielleicht:
std::string s(reinterpret_cast<char*>(&msgheader), sizeof(msgheader));sieht sehr gut aus, funktzt auch.
eine Frage bleibt allerdings ... wie sieht das andersrum aus?
also von string zurück zum struct,
ich habs probiert, allerdings probleme damit//gegeben ist //string *Msg mit dem umgewandelten stuckt am anfang und danach dem inhalt MSGHeader header(reinterpret_cast<MSGHeader>(Msg->substr(0,sizeof(header))), sizeof(header));aber es klappt nicht
error: invalid cast from type ‘std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ to type ‘MSGHeader’
-
evt. MSGHeader* pHeader = reinterpret_cast<MSGHeader*>(Msg->c_str()); ... aber eher nicht ... was du da machst ist insgesamt nicht sehr sinnig ... sry

-
memcpy(&header, s.data(), s.length());
-
(D)Evil schrieb:
evt. MSGHeader* pHeader = reinterpret_cast<MSGHeader*>(Msg->c_str()); ... aber eher nicht ... was du da machst ist insgesamt nicht sehr sinnig ... sry

von außen gesehen nicht...
wenn man aber über seine sockets nur strings übertragen kann.. dann schon

-
Über einen Socket kannst du nur char* übertragen ... da ist ein unterschied ... ein großer.
-
download123 schrieb:
(D)Evil schrieb:
evt. MSGHeader* pHeader = reinterpret_cast<MSGHeader*>(Msg->c_str()); ... aber eher nicht ... was du da machst ist insgesamt nicht sehr sinnig ... sry

von außen gesehen nicht...
wenn man aber über seine sockets nur strings übertragen kann.. dann schon

Gerade dann würde ich mich nicht abhängig von Compilerversionen und internen Speicherrepräsentationen machen, sondern ein vernünftiges Protokoll definieren ... oder ein bestehendes einsetzen.
Gruß,
Simon2.
-
(D)Evil schrieb:
Über einen Socket kannst du nur char* übertragen ... da ist ein unterschied ... ein großer.
welchen meinst du?
Simon2 schrieb:
Gerade dann würde ich mich nicht abhängig von Compilerversionen und internen Speicherrepräsentationen machen, sondern ein vernünftiges Protokoll definieren ... oder ein bestehendes einsetzen.
Gruß,
Simon2.
Gib doch mal ein beispiel was du mit vernünftiges Protokoll meinst?
-
Hi,
naja das einfachste hat bereits KasF vorgeschlagen. Es fordert allerdings festgelegte Reihenfolge und Typen der Parameter und bietet keinen "Kompatibilitätsschutz", aber für eine einache Anwendung reicht das erstmal.
Ansonsten ist bis XML (will das nicht als ideal darstellen, ist aber schon ein recht mächtiges Protokoll) alles möglich.Gruß,
Simon2.