char array zu int konvertieren



  • Hallo Leute,
    ich habe vor ein Paar experimente mit tcp anzustellen :D.
    Dabei stoße ich auf das Problem, dass die Daten, die ich aus dem Socket lese, in einem char* buffer gespeichert sind. Wenn ich aber jetzt z.B. einen int übertragen will muss ich das ganze ja irgendwie konvertieren.
    Dazu habe ich folgende überlegung angespellt:

    #include <iostream>
    
    int main()
    {
        char * testc=new char[4];
        testc[0]=20;
        testc[1]=0;
        testc[2]=0;
        testc[3]=0;
        int* testi=reinterpret_cast<int*>(testc);
        std::cout << *testi;
    }
    

    ( die ausgabe ist 20 )

    Das ganze funktioniert soweit auch, aber ich kann mir 1. nicht vorstellen, dass das ein guter Stil ist und 2. nicht erklären, warum ich testc[0] auf 20 setzen musste und nicht testc[3].
    Warum ist das so und wie macht man das richtig ? 🙂
    Freundliche Grüße,
    MrKnister


  • Mod

    Stichwort, warum du testc[0] auf 20 setzen musst und nicht testc[3]: Endianess

    Eine allgemeine, saubere Lösung für sämtliche Arten von Daten: Serialization
    Musst du auch nicht (alles) selber machen:
    http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html

    Wenn du es wirklich nur mit ints zu tun hast, dann kannst du natürlich auch eine weniger allgemeine Lösung wählen. Mit dem Endianess-Stichwort solltest du alles nötige gefunden haben, um dir selber etwas zu basteln. Viele Netzwerkbibliotheken (was auch immer du verwendest) sollten für Basisdatentypen bereits fertige Funktionen bieten, die diese in ein einheitliches Format übertragen und hinterher in das Format beim Empfänger zurück konvertieren (im Prinzip ist das Serialization für Arme, dafür aber evtl. komfortabler im Zusammenspiel mit der Netzwerkimplementierung).



  • Google mal nach BigEndian und LittleEndian. Du wirst dann sehen, dass es gefährlich werden kann, int s herumzuschicken.
    Es ist sicherer, int-Werte lesbar in einen String zu verpacken, und den dann zu versenden.



  • Danke für die schnellen Antworten.
    Zum Netzwerken benutze ich boost.asio. Die Bibliothek müsste ja sowas zur verfügung stellen.
    Ich guck mir das ganze noch mal genauer an.


Anmelden zum Antworten