Datentyp für Binärprotokoll



  • Hallo C++ler,

    ich möchte in C++ ein Netzwerk Protokoll implementieren, in dem unteranderem Bytes vorkommen, die keine Zuordnung in der ASCII Tabelle haben ('\0', '\a', ...)
    Da jedoch nicht feststeht wieviele Daten ankommen sollte dieser Datentyp am besten dynamisch wachsen (ich speichere immer 1024 Bytes in einem Bytearray zwischen und übergebe diese dann). Arrays sind ziemlich unpraktisch, weil sie bei Änderungen der Größe umkopiert werden müssen, Vectoren sind unpraktisch weil man bei ihnen nur auf einzelne Bytes Zugriff hat, strings sind nicht dafür gedacht, daher bieten sie keinen leichten Zugriff auf einzelne Bytes, und sind langsam (noch dazu bin ich mir ziemlich sicher bei meinem letzten Test gesehen zu haben, dass sie falsch mit nichtdarstellbaren Bytes umgehen)
    Ich hoffe ihr habt mich verstanden, und könnt mir sagen welcher Datentyp in diesem Fall angebracht wäre

    mfg Pseudo



  • Vectoren sind unpraktisch weil man bei ihnen nur auf einzelne Bytes Zugriff hat

    Bitte was? Wie genau meinst du das? std::vector<T> ist fast das gleiche wie ein unique_ptr<T[]>..


  • Mod

    Also eine unbekannte Menge unbekannter Daten? ➡ vector<unsigned char>

    edit: Das Vorzeichen legen wir der Form halber besser auch noch fest. Ob signed oder unsigned ist dabei egal, Hauptsache einheitlich über alle Maschinen.



  • Ich meine das ich (nach meinen Versuchen) nur auf einzelne Bytes Zugriff habe, und nicht sagen kann: schreib mir vom Vector ab Feld 43 genau 14 Bytes in dieses Char Arrray. Es gibt also keine Methode mit der ich mehrere Bytes kopieren kann. Ich habe grade noch einen interessanten Datentyp gefunden: stringstream
    Der enthält zumindest die nötigen Funktionen, arbeitet aber leider mit strings, gibt es irgendeine stream Klasse/Template das für Bytes geeignet ist?

    mfg Pseudo



  • Mal

    std::vector<char> v(1000 /* size */);
    memcpy(&v[42], 14, ...);
    

    versucht?



  • Also bei folgendem Beispiel sagt mir der Debugger, dass in 0 und 1 Nullen sind (richtig) aber danach kommen nurnoch 'H' und 'a'...

    int _tmain(int argc, _TCHAR* argv[])
    {
    	char* Test1 = "\0\0Hallo Welt!";
    	std::vector<unsigned char> v(1000);
    
    	char* Test2;
    	Test2 = new char[1000];
    
    	memcpy(&v[0],  &Test1[0], sizeof(Test1) / sizeof(Test1[0]));
    
    	memcpy(&Test2[0], &v[0], sizeof(Test1) / sizeof(Test1[0]));
    
    	return 0;
    }
    

  • Mod

    char* Test1
    // ...
    sizeof(Test1)  // wie viel ist das wohl?
    

    Wenn du mit solchen Sachen schon Schwierigkeiten hast, ist das eigentlich ein sehr, sehr guter Grund, von Pointerfrickelei vorerst Abschied zu nehmen und sauber mit STL-Containern zu arbeiten.

    P.S.: Wie wäre es mit std::copy? Damit wäre das auch nicht passiert.



  • Dann prüf doch mal, was da
    sizeof(Test1)
    wohl bei rauskommmt ...



  • Wenn man in letzter Zeit zuviel Delphi programmiert hat denkt man da hält nich immer dran 😃
    Oh Gott ist das ein peinlicher Fehler, sizeof gibt natürlich die Größe des Pointers zurück (unter Win32 4 Bytes)

    Okay, Sorry

    Ich glaub des Problem is gelöst
    Danke 😃


Anmelden zum Antworten