verschiedene Variablen in char[] packen
-
ich bin auf der Suche nach schnellem Algorythmus, die mir z.B. mehrere int Variablen in eine char[] packt.
Dieses Format brauche ich, um sie über eine Socket- Verbindung zu schicken.hab eigetlich vor gehabt, die int's temporär in CString zu casten, dann alle addieren und schließlich
CString strTemp = "Variablen nach der Umwandlung in CString"; int bufferSize = strTemp.GetLenght() + 1; char* pBuffer = new char [ bufferSize ]; sprintf(pBuffer, _T("%s\0"), strTemp); socket.Send (buffer, bufferSize, 0); // sende über Socket Verbindung delete pBuffer;Gibts es besseres, oder anders ausgedruckt etwas schnelleres ?
z.B. ohne den CString (wegen Kon-und Destruktion des Objektes)Hat jemand Idee ?
Grüße
-
Roman007 schrieb:
[...] char* pBuffer = new char [ bufferSize ]; [...] delete pBuffer;delete [] pBuffer;Nicht vergessen:
Array-zu-Array und Staub-zu-Staub
-
int main() { int a = 0, b = 1234, c = -654321; char SendCString[3 * sizeof(int)]; memcpy(SendCString + 0, reinterpret_cast<char*>(&a), sizeof(int)); memcpy(SendCString + 4, reinterpret_cast<char*>(&b), sizeof(int)); memcpy(SendCString + 8, reinterpret_cast<char*>(&c), sizeof(int)); // Hier kann der SendCString dann gesendet werden. // Der folgende Code wird dann beim Empfänger ausgeführt: int a2, b2, c2; a2 = *(reinterpret_cast<int*>(SendCString + 0)); b2 = *(reinterpret_cast<int*>(SendCString + 4)); c2 = *(reinterpret_cast<int*>(SendCString + 8)); cout << a2 << endl << b2 << endl << c2; cin.get(); return 0; }edit: warumkannichlängeretextenichtmehrschreiben?
-
edit: das ist jetzt zu meinem post davor, weil zusammen will geht's irgentwie nciht. (siehe ps)
Deine Vorgehensweise hab ich irgentwie nicht vestanden.
Ich hab allerdings gehört, dass der reinterpret_cast von einigen Compilier falsch implementiert wird, bei mir (MinGW) hat's allerdings geklappt.
Ich hab den CString jetzt auf dem Stack erstellt, wenn du ihn auf dem Heap erstellen willst, empfehle ich die das shared_array Templete von der boost Library. Ich hab's jetzt aber nicht benutzt damit es einfacher ist.
mfg.
ps: Irgentwie kann ich nur ab und zu was antworten. Ich klick auf den absenden button und dann passiert gar nichts. nach ner zeit kommt dann, dass die verbindung vom server zurück gesetzt wurde.
-
#include <boost/serialization.hpp> #include <string> #include <sstream> std::ostringstream stream; boost::archive::text_oarchive out (stream); out << data1; out << data2; // etc. std::string str = stream.str (); socket.Send (str.c_str (), str.length (), 0); // sende über Socket VerbindungSiehe http://www.boost.org/libs/serialization/doc/index.html
-
Danke Leute,
@HumeSikkins
hast natürlich recht, schnell getippt
@joomoo
sieht interessant aus, muss ich wohl probieren, wie schnell es ist
Dekodieren brauche ich nicht, die Daten werden an Java-Applet gesendet, da gibt Standard-Methode, die sich darum kümmert.@.filmor
davon habe ich nicht gehört, schau mir mal genauer anTHX
-
Ich nahm an, dass du es an ein C++ Programm sendest, aber Java hat doch AFAIK ziemlich gute XML-Unterstützung, oder? Dann wäre möglicherweise
boost::archive::xml_oarchiveangebrachter. Ist bestimmt einfacher, als einen Text zu parsen.
-
-
Hallo,
in Java läßt sich aus dem serialisierten Stream einfach die Variablen auslesen:[code] int a = DataInputStream.readInt(); // liest erste Zeichenfolge bis Leezeichen als int ein DataInputStream.readChar(); // Überspringt das Leerzeichen //u.s.w. [/code]Es gibt Methoden für diverse Typen. Einfacher geht nicht! Oder?

dafür ist das hier das falsches Forum, aber gehört eben zum Thread.So eine Klasse wünschte ich mir auch in c++

Roman
-
Roman007 schrieb:
Hallo,
in Java läßt sich aus dem serialisierten Stream einfach die Variablen auslesen:[code] int a = DataInputStream.readInt(); // liest erste Zeichenfolge bis Leezeichen als int ein DataInputStream.readChar(); // Überspringt das Leerzeichen //u.s.w. [/code]Es gibt Methoden für diverse Typen. Einfacher geht nicht! Oder?

dafür ist das hier das falsches Forum, aber gehört eben zum Thread.So eine Klasse wünschte ich mir auch in c++

Roman
Das ist zwar einfach, aber es ist langsam und uneffizent. Ein int kann bis zu 4 millarden gehen, also 10 Stellen. Das wäre, wenn du das ganze über diese Methode schickst 10 Byte + 1 Byte für das Leerzeichen. Und wenn du heiß auf Schnelligkeit bist, ist dies bestimmt die schlechteste Möglichkeit. Die Methode, das int binär zu senden, verbraucht weniger traffic und ist schneller, also effizienter. Dort würde ein int immer 4 Byte verbrauchen, und wenn du int nimmst, darf man davon ausgehen dass du auch mehr als 3 Stellen hast.
Ich hoffe ich hab die Java Funktionen richtig verstanden. Für mich sieht das aus wie sscanf.
mfg.
-
edit: Doppelpost. Keine Ahnung warum.