Gibt es sowas für QT/C++?
-
Hallo,
Ich probiere grade eine Klasse von C# nach c++ zu übersetzen.
Dabei geht es darum ein Packet - Protokoll zu erstellen.Gibt es folgende Funktionen ähnlich in cpp?
Oder wie sollte ich dies am besten darstellen?public void Append<T>(T item) { T[] t = new T[] { item }; int objSize = Marshal.SizeOf(typeof(T)); if (index + objSize > MAX_BUFFER_SIZE) { throw new Exception("Append buffer overflow."); } GCHandle handle = GCHandle.Alloc(t, GCHandleType.Pinned); Marshal.Copy(handle.AddrOfPinnedObject(), workspace, index, objSize); index += objSize; }
Sie fügt einem byte-array an Stelle X weitere bytes hinzu (je nach Grösse des angegeben types [BYTE, WORD, DWORD, ...]).
Gruss,
Marshal
-
stringstream s(ios_base::in | ios_base::binary); //... template<class T> void Append(const T& item) { s.write((char*)&item, sizeof(item)); } // Zugriff auf gesamten Datenstrom mit s.str()
-
Hallo,
Vielen Dank dafür!Wie kann ich dann spezielle Positionen "nachfügen"?
Sprich schlussendlich gebe ich mit einer Funktion den ganzen stringstream zurück.
Nur möchte ich zuerst noch an die erste Stelle die Grösse des ganzen streams (im 1. WORD des ganzen streams) angeben.Gruss,
Marshal
-
Ist so nicht direkt vorgesehen, man kann zwar zur ersten Position springen, dann überschreibt man aber das Folgende. Simpler ist sowas in der Art:
string AddLength(const string& str) { stringsteam s(ios_base::in | ios_base::binary); // neue lokale Variable size_t length = str.size(); s.write((char*)&length, sizeof(length)); s << str; // evntl. unverträglich mit dem write. in dem fall muss man s.write(str.c_str(), length) nehmen return s.str(); } // Aufruf: stringstream s(ios_base::in | ios_base::binary); Append(...); return AddLength(s.str());
-
Danke.
Jetzt habe ich aber zum schluss noch eine etwas andere Frage.
Die Daten will ich später mittel dem QTcpSocket versenden.
Dieses nimmt als Parameter ein QByteArray.Wie kann ich den stream in ein eben solches ByteArray konvertieren?
Der Konstruktor des QByteArrays gibt mir leider auch keine wirklichen Aufschlüsse.Gruss,
Marshal___
-
Der Konstruktor
QByteArray ( const char * data, int size )
ist der richtige (QByteArray(str.c_str(), str.size())
). Wenn du aber sowieso ein ByteArray hast, kannst du dir den Umweg über den Stream sparen. QByteArray bietetappend
fürs Anfügen und sogarinsert
für Einfügen an beliebiger Position undprepend
für Einfügen an den Anfang (z.B. für die Länge). Die Parameter sind jeweils die gleichen wie beistringstream::write
.
-
Hallo,
Danke vielmals für deine Hilfe.
Ich bin nun so weit (denke ich jedenfalls) dass cih die Packete mal richtig verpacke und versende.Das Protokoll der Packete soll folgendermassen aufgebaut sein:
[WORD] DataSize
[const char*] DataIch empfange also bei der startRead Methode meines Clients die Packete.
Dazu erstelle ich einen Buffer mit einer statischen Grösse von - sagen wir mal - 1024.QByteArray RawDataPacket = QByteArray(1024, Qt::Initialization);
So, nun will ich die Grösse der Data ermitteln, und diese dann einem neuen ByteArray angeben.
Wie kann ich also aus den zwei ersten Bytes (-> WORD) die Grösse rauslesen?
Ich muss das ganze ja zuerst noch in ein Word 'konvertieren'.war da nicht was à la Highbyte*255+Lowbyte?
Gruss
-
Marshal___ schrieb:
war da nicht was à la Highbyte*255+Lowbyte?
Nein, 256. Üblicherweise nimmt man aber
int(Highbyte) << 8 | Lowbyte
.windows.h
enthält dafür das fertige MakroMAKE_WORD
.