short int array als char* msg per socket verschicken



  • Hallo,

    ich stehe vor folgendem Problem:
    Ich muss aus zwei short int-Variablen und einem dynamischen short int-Array eine char* msg erzeugen und diese per socket-Verbindung verschicken. Am Ziel angekommen, sollen diese Informationen wieder in zwei Variablen und einen Array extrahiert werden.

    Ich brauche mal einen Ansatz, wie ich das machen kann. Allerdings möchte ich möglichst keine vorgefertigten Klassen verwenden, sondern das über eine (bzw. zwei) kleine Methode(n) zu bewerkstelligen, die ich aufrufe, sobald die socket-Verbindung "steht". Es reicht mir vorerst, in einem kleinen Testprogramm die Wege short-int-to-char und wieder zurück umzusetzen. Bin für jegliche Hilfe dankbar.

    Gruß,
    c++-Neuling



  • memcpy



  • Plattformunabhängig:

    void serialize(unsigned short in, unsigned char out[2])
    {
        out[0] = in & 0xFF;
        out[1] = (in >> 8) & 0xFF;
    }
    
    void deSerialize(const unsigned char in[2], unsigned short& out)
    {
        out = (in[1] << 8) | in[0];
    }
    


  • Hi,

    cpp-neuling schrieb:

    Allerdings möchte ich möglichst keine vorgefertigten Klassen verwenden, sondern das über eine (bzw. zwei) kleine Methode(n) zu bewerkstelligen, die ich aufrufe, sobald die socket-Verbindung "steht".

    was meinste damit? garkeine oder was auch ned z.B. stringstream
    Wenn ja warum? 😕

    wennst dich doch dafür entscheidest könnste ja evtl per stringstream machen
    hier mal ein beispiel:

    std::stringstream ssTmp;
    short zahl1 = 1;
    short zahl2 = 2;
    
    ssTmp << zahl1 << " " << zahl2;
    
    //blabla verbindung aufbauen usw....
    
    send(socket, ssTmp.str().c_str(), ssTmp.str().length(), 0);
    
    //auf der anderen seite empfangen und in stringstream packen
    short val
      for (int n=0; n<2; n++)
      {
        ssTmp >> val;
        std::cout << val << std::endl;
      }
    

    sollte doch Funktionieren oder?

    Wenn ned sagt bescheid 🙂 .

    Viel spaß noch

    PinguGroup



  • Hallo und danke für die flinken Antworten

    @nanananaaaa
    Entweder memcpy eignet sich nicht dafür, oder ich benutze das falsch. Ich kann auf jeden Fall die short int nicht richtig konvertieren und anhängen klappt auch nicht.

    @Tachyon
    Der Ansatz sieht schon sehr gut aus und der Compiler meckert auch nicht, aber wenn ich das auf dem Bildschirm ausgebe sind scheinbar nur Leerzeichen drin.

    Hier mal mein Code bisher

    #include <string.h>
    #include <iostream.h>
    
    void shortIntToChar(short int in, unsigned char out[2]) {
    	out[0] = in & 0xFF;
    	out[1] = (in >> 8) & 0xFF; 
    }
    
    int main ( void ) {
    	int stop;
    
    	short int laenge;
    	cout << "\nLaenge eingeben: ";
    	cin >> laenge;
    
    	short int schwelle;
    	cout << "\nSchwelle eingeben: ";
    	cin >> schwelle;
    
    	short int *sequenz;
    	sequenz = new short int[laenge];
    	for ( short int i = 0; i < laenge; i++ ) {
    		sequenz[i] = 1;
    	}
    	cout << "\n\n";
    	for ( short int i = 0; i < laenge; i++ ) {
    		cout << sequenz[i] << "_";
    	}
    
    	unsigned char *msg, *buffer;
    	msg = new unsigned char[2*(laenge+2)];
    	buffer = msg;
    	shortIntToChar(laenge, buffer);
    	buffer+=2;
    	shortIntToChar(schwelle, buffer);
    
    	cout << "\n\n" << msg;
    
    	cin >> stop;
    }
    

    Nur, dass ich das richtig verstehe...
    Ein char hat 1 Byte, short int 2 Byte. Deshalb allokiere ich Speicher der doppelt so groß ist, wie die Anzahl der benötigten chars?
    Ich benutze einen Pointer, um das Array entlang zu wandern und jeweils an die Funktion von Tachyon weiterzugeben.
    Mache ich irgendwas falsch?



  • @PinguGroup
    Sieht auch sehr gut aus, aber brauche ich dafür noch eine andere Header-Datei ausser string.h ?
    Mein Compiler meint: Fehler: Aggregat »std::stringstream ssTmp« hat unvollständigen Typ und kann nicht definiert werden

    Hier der Code:

    std::stringstream ssTmp;
    ssTmp << laenge << " " << schwelle;
    for ( short int i = 0; i < laenge; i++ ) {
    	ssTmp << " " << sequenz[i];
    }
    


  • #include <sstream>
    

    Referenz



  • Danke schön, das hat wirklich super funktioniert! 🙂
    Damit ging es ja sogar supereinfach! Hoffentlich findet Ihr auch meine nächsten Posts 🙂


Log in to reply