Probleme bei Datenempfang in Buffer, anschl. Kopieren und Umwandlung



  • Hallo zusammen,

    (...wurde gebeten, diesen Beitrag hier und nicht bei "C++" zu posten (macht Sinn)...)

    ich habe ein merkwürdiges Problem. Über einen UDP-Socket empfange ich Daten in einen Buffer. Aus diesen Daten möchte ich dann zunächst 6 bestimmte Zeichen (Zeitangabe HHMMSS) herauskopieren, die ich anschließend auf ein reines Sekundenformat umrechnen möchte.

    Problem1: Wenn ich pTime auf [6] beschränke, schreibt er mir beim Kopieren in pSekun1 Müll. Wenn ich zum Testen auf [8] erweitere, dann steht zwar in den letzten 2 Zeichen (also 6 und 7 von pTime1) Müll, meine Werte an Stelle 5 und 6 von pTime1, die ich ja haben wollte sind dann aber okay. Wie kommt das?!

    Problem2: Beim Debuggen bleibt er direkt hinter der Berechnung der Sekundenzahl hängen (iSekBerechnet1), also in die Variable iSekBerechnet1 schreibt er gar keinen Wert. Hat jemand von euch eine Ahnung, woran das liegen kann?! In iStd1, iMin1 und iSek1 stehen die richtigen Werte, das habe ich beim Debuggen überprüft. Wieso will er dann keine Multiplikation durchführen?! Oder liegt der Fehler woanders?

    Das Code-Stückchen habe ich euch unten angehängt.

    Vielen Dank!!

    char pBuffer1[1024] = {0};  // Hier hinein werden die über den
                                // UDP-Socket empfangenen Daten gespeichert
    
    char	*pTime1 = new char[8];	// Zeitstempel HHMMSS
    char	*pStd1 = new char[2];   // Zum Speichern von HH,
    char	*pMin1 = new char[2];   // MM,
    char	*pSekun1 = new char[2]; // SS
    char    *pTest1 = new char[2];  // Test
    
    iRx = WlanRxSock1.ReceiveFrom(pBuffer1, iRxBuffer, strWlanTxIP, TxPortUINT);
    
    // Kopieren des mitgesendeten Zeitstempels:	
    memcpy(pTime1, (char *) (pBuffer1 + 102), 8);
    
    memcpy(pStd1, (char *) (pTime1), 2);		// Stunden
    memcpy(pMin1, (char *) (pTime1 + 2), 2);	// Minuten
    memcpy(pSekun1, (char *) (pTime1 + 4), 2);	// Sekunden
    memcpy(pTest1, (char *) (pTime1 + 4), 2);	// Sekunden
    
    iStd1 = atoi(pStd1);     // iStd1, iMin1, iSek1 sind integer
    iMin1 = atoi(pMin1);
    iSekun1 = atoi(pSekun1);
    
    // Berechnung der akt. Zeit in Sekunden:
    // iSekBerechnet1 ist long int
    iSekBerechnet1 = ((iStd1 * 3600) + (iMin1 * 60) + iSekun1); // Will nicht weiter...
    


  • funktioniert das:

    // Kopieren des mitgesendeten Zeitstempels:   
    memcpy(pStd1, (char *) (pBuffer1 + 102), 2);        // Stunden
    memcpy(pMin1, (char *) (pBuffer1 + 104)), 2);    // Minuten
    memcpy(pSekun1, (char *) (pBuffer1 + 106), 2);    // Sekunden
    


  • Nein, da kommt leider das Gleiche dabei heraus...

    Die Zeile

    memcpy(pTest1, (char *) (pTime1 + 4), 2);    // Sekunden
    

    hatte ich zum Testen eingefügt. Auch pTest1 wandele ich per atoi() in einen integer um:

    iTest1 = atoi(pTest1);
    

    Aaaaber: In iTest1 steht kein Wert, während in iSekun1, iMin1 und iStd1 die richtigen Integer-Werte stehen. Kommentiere ich die oben genannten Test-Zeilen wieder aus, ist ja sozusagen das memcpy() und das atoi() mit den Sekunden der letzte Schritt jeweils. Dann steht wiederum in iSekun1 kein Wert (auch keine Null, wenn ich beim Debuggen mit der Maus raufgehe, tut sich nichts), iMin1 und iStd1 sind wiederum korrekt. Anscheinend schleppt sich der Fehler immer zum letztaufgerufenen atoi(), woraus ich evtl. schließe, dass beim memcpy doch irgendwas nicht so läuft wie es soll?! (Auch wenn die richtigen integer-Werte in iStd1 und iMin1 ja dafür sprechen, dass keine komplette Grütze kopiert wird...)



  • ...gibt es sonst noch einen anderen Weg, mir die entsprechenden Stellen aus pBuffer1 rauszulesen und in einen Integer umzuwandeln?

    Ach so: Ich hatte noch etwas versucht, und zwar habe ich pStd1, pMin1 und pSekun1 in Strings umgewandelt und dann durch atoi() geschickt - auch das hat nichts gebracht.



  • ich weiss nicht ob's daran liegt, aber: atoi() will 'nen string sehen, der mit einer 0 abgeschlossen wird. wenn du z.b. zwei zeichen aus deinem buffer mit atoi() umwandeln willst, dann musst du sie in einen 3-byte grosses array kopieren und eine null nachträglich anhängen.
    ausserdem würde ich diese 'new's da weglassen. so kleine arrays kannste auch direkt anlegen. und diese ganzen casts nach 'char*' brauchst du auch nicht.
    🙂



  • die frage ist nur, ob in pBuffer auch die korrekten werte drin stehen???? hast du dir das mal angeschaut...?? weil es dürfste sonst keine probleme geben!!

    was steht denn in pStdl,pninl,pSekunl drin nach diesen operationen:

    memcpy(pStd1, (char *) (pBuffer1 + 102), 2);        // Stunden
    memcpy(pMin1, (char *) (pBuffer1 + 104)), 2);    // Minuten
    memcpy(pSekun1, (char *) (pBuffer1 + 106), 2);    // Sekunden
    

    Wen hier die richtige werte drin stehen, dann kann es sich noch um die 0 Terminierung handeln

    char    *pStd1 = new char[3];   // Zum Speichern von HH,
    pStd[2]='\x0';
    char    *pMin1 = new char[3];   // MM
    pMin1[2]='\x0';
    char    *pSekun1 = new char[3]; // SS
    pSekun1[2]='\x0';
    


  • Es funktioniert jetzt.
    Das Kopieren in Strings und die direkte Entnahme aus dem Buffer (ohne Zwischenbuffer) haben geholfen.
    Denke ich. 😉
    Vielen Dank für die Mühen.


Anmelden zum Antworten