Typkonvertierung von byte nach string und umgekehrt?



  • Hallo werte Gemeinde!

    Ich steh vor der Herausforderung einen Roboter(Client) über Ethernet TCP/IP mit einem externen PC(Server) zu verbinden. Um den Datenaustausch zwischen beiden zu gewährleisten liefert der Hersteller einen C#-Schnipsel mit, der compiliert als ServerApplikation arbeitet. Das Programm offnet einen ListenSocket, und wenn der Client eine Verbindung zum Server aufbaut, dann übernimmt ein HandlerSocket die Verbindung zwischen beiden. Danach werden synchron Daten ausgetauscht.

    So nun bin ich dabei den C#-Code in C++-Code zu übersetzen und scheitere gerade an der Konvertierung des ankommenden Byte-Streams in einen String. In C# steht folgendes:

    byte[] bytes = new Byte[1024];
    String strReceive = null;
    String strSend = null;

    int bytesRec = handler.Receive(bytes);
    if (bytesRec == 0)
    {
    break;
    }

    strReceive = String.Concat(strReceive,System.Text.Encoding.ASCII.GetString(bytes,0,bytesRec));

    Zur Erklärung: bytes ist der Emfangspuffer, bytesRec zählt die empfangenen Bytes, strReceive beinhaltet den konvertierten Inhalt von bytes, wenn neue Infos in bytes hinzukommen, dann werden diese infos wieder(while-Schleife) konvertiert und an strReceive angehängt(String.Concat). Es findet eine Konvertierung vom Typ Byte(?) nach ASCII String statt. Es werden XML-Daten gesendet und empfangen.

    Und nun bin ich am Suchen und machen, dass ich den obigen C#-Code in C++ übersetze. Ich hab da son paar fetzen gefunden, bin aber unsicher ...

    z.Bsp.: (C++-Code)

    BYTE test[] = "Hello";
    string container;

    container = reinterpret_cast<char *>(test);

    oder:

    strReceive += (string) bytesRec

    Was meint ihr dazu? Und wie funktioniert das dann in die andere Richtung?

    Gruß, Matze



  • "BYTE" ist normalerweise ein typedef für unsigned char (wer etwas anderes gehört hat, bitte belegen), also solltest du dein BYTE-Array bedenkenlos als char-Array verwerten können (Stichwort "cast").

    Und wenn ich deinen C# Code übersetzen wollte, dürfte das etwa so aussehen:

    BYTE bytes[1024];
    int bytesRec = recv(handler,bytes,1024,0);//entspricht dem Handler.Recieve()-Aufruf
    if(bytesRec==0)
      break;
    strRecieve.append((char*)bytes,bytesRec);
    

    Für die Gegenrichtung kannst du einfach strSend.c_str() auf die Leitung schicken:

    send(handler,strSend.c_str(),strSend.length(),0);
    


  • Danke CStoll, danke für Deine Müh!

    Hab ich das richtig mitbekommen? BYTE, is das nicht .NET Zeugs? Denn als typedef gibts das ja nicht in C++. Ich möchte ohne .NET arbeiten.

    Deine Sende- und Empfangsvariablen (strReceive & strSend) sind soweit ich das Erkennen kann, Strukturen oder Objekte. In C# sind sie bei mir folgendermaßen definiert. (Sorry hatte ich vergessen zu schreiben)

    String strReceive = null;
    String strSend = null;

    Sowas wird doch in C++ mit char strReceive ... ? erreicht, oder?
    Wie würde denn der C++ Code aussehen, wenn Du es ohne Objekt schreibst?



  • matze77 schrieb:

    Hab ich das richtig mitbekommen? BYTE, is das nicht .NET Zeugs? Denn als typedef gibts das ja nicht in C++. Ich möchte ohne .NET arbeiten.

    BYTE gibt es auch in der MFC - aber vermutlich reicht es aus, mit char zu arbeiten (laut MSDN senden/empfangen die Socket-Funktionen auch char*-Daten).

    Deine Sende- und Empfangsvariablen (strReceive & strSend) sind soweit ich das Erkennen kann, Strukturen oder Objekte. In C# sind sie bei mir folgendermaßen definiert. (Sorry hatte ich vergessen zu schreiben)

    String strReceive = null;
    String strSend = null;

    Sowas wird doch in C++ mit char strReceive ... ? erreicht, oder?
    Wie würde denn der C++ Code aussehen, wenn Du es ohne Objekt schreibst?

    "char strRecieve;" wäre ein wenig klein - nimm lieber "std::string strRecieve;" dafür (das dürfte die beste Entsprechung zu C# String sein).



  • Hui das ging schnell, danke! 🙂

    Und dazu muss ich dann bestimmt noch was includen, nicht wahr?

    bisher siehts bei mir so aus:

    #include <iostream.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winsock2.h>
    #include <string.h>



  • <iostream.h> gibt's nicht mehr (die heißt jetzt <iostream>), <string.h> ist der falsche Header (der enthält strcpy() und Co.) - du brauchst stattdessen die <string>.
    (und anstelle der <stdlib.h> kannst du auch gleich die <cstdlib> verwenden)

    Zur Erklärung: Die Header der C++ Standardbibliothek haben keine Dateiendung, die Header der C-Bibliothek (string.h, stdlib.h etc) stehen in C++ auch noch zur Verfügung, aber man sollte lieber die an C++ angepasste Version davon verwenden (cstring, cstdlib etc).



  • Wow, danke CStoll! 👍


Anmelden zum Antworten