Inhalt eines uChar Arrays filtern



  • cpp?

    #include <string>
    
    void split_data(const unsigned char* data, std::vector<std::string>& dest)
    {
        dest.clear();
        std::string tmp(static_cast<const char*>(data));
        std::size_t pos = 0;    
        do {
            std::size_t pos = tmp.find_first_of('"');
            tmp.erase(0, pos + 1);
            pos = tmp.find_first_of('"');
            dest.push_back(tmp.substr(0, pos));
            tmp.erase(0, pos + 1);
        } while (tmp.lenght() > 0);
    }
    

    irgendwie so in der art ...



  • Und immer schön dran denken, die Daten müssen nicht so schön geordnet ankommen, also alle Lösungen bisher Bullshit.

    --> Alles in ein String/Deque/whatever zwischenspeichern und einen xmlparser die Arbeit machen lassen.



  • Oh es geht um UDP naja da ist es das selbe. Warum nimmt man UDP für einen Controllstream? 🙄



  • <Stuss Detection Successfull>

    Stuss Detected:

    Kenner von TCP schrieb:

    Und immer schön dran denken, die Daten müssen nicht so schön geordnet ankommen, also alle Lösungen bisher Bullshit.

    --> Alles in ein String/Deque/whatever zwischenspeichern und einen xmlparser die Arbeit machen lassen.

    Kenner von UDP schrieb:

    Oh es geht um UDP naja da ist es das selbe. Warum nimmt man UDP für einen Controllstream? 🙄

    at 19:12:36 12.06.2007



  • Hmm..
    Also ich habs jetzt mal ganz einfach so gelöst:

    int places[50];
    						int b=0;
    						for ( int a =0;a<sizeof(buffer);a++)
    						{
    							if( buffer[a] == 0x22)
    							{
    								places[b] = a;
    								b++;
    							}
    						}
    

    Das funzt auch soweit.
    Meine Frage:
    Wie bekomm ich jetzt den Inhalt von

    buffer[places[0]]
    

    bis

    buffer[places[1]]
    

    und den Inhalt von

    buffer[places[2]]
    

    bis

    buffer[places[3]]
    

    in ein char array rein?

    Hab mal bisschen mit substr rumgespielt, ist aber nichts bei rumgekommen 😃

    Edit:
    Zur Errinerung:

    unsigned char buffer[1024];
    

    Danke schonmal!

    Greetings,
    Coke



  • hm?

    #include <cstring>
    
    unsigned byte arr_byte[1024];
    for (unsigned short n = 0; n < 1014; n += 2)
    {
        char arr_char[3];
        std::strncpy(arr_char, 2, &arr_byte[n]);
        std::cout << arr_char << std::endl;
    }
    


  • Also in deinem Fall dann:

    unsigned char buffer[1024];
    int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!)
    int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!)
    char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ...  + 1 für Nullterminierung
    std::strncpy(arr, pos2 - pos1, &buffer[pos1]); // die Länge des Strings, ab pos1 aus buffer ...
    std::cout << arr << std::endl; // ausgeben 
    delete [] arr; // freigeben ...
    


  • Huhu!

    Hab das mal eingebaut, oben auch das include cstring, allerdings bekomm ich folgende Fehler:

    error C2059: Syntaxfehler: '::'
    error C2059: Syntaxfehler: '::'
    error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
    error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
    error C2664: 'strncpy': Konvertierung des Parameters 2 von 'int' in 'const char *' nicht möglich       
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    


  • ja sry .... brauchst noch #include <algorithm> für std::max und std::min und std::strncpy verlangt als 2. Argument den Dest-String und als 3. die Länge ... also 2. und 3. Parameter vertauschen
    =>

    #include <cstring>
    #include <iostream>
    
    unsigned byte arr_byte[1024];
    for (unsigned short n = 0; n < 1014; n += 2)
    {
        char arr_char[3];
        std::strncpy(arr_char, &arr_byte[n], 2);
        std::cout << arr_char << std::endl;
    }
    

    und

    #include <algorithm>
    #include <cstring>
    
    unsigned char buffer[1024];
    int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!)
    int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!)
    char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ...  + 1 für Nullterminierung
    std::strncpy(arr, reinterpret_cast<const char*>(&buffer[pos1]), pos2 - pos1); // die Länge des Strings, ab pos1 aus buffer ...
    std::cout << arr << std::endl; // ausgeben
    delete [] arr; // freigeben ...
    

    dann sollte es aber gehen 🙂



  • Das mit den Places ist aber Unfug...

    Ich würds noch eher so machen

    char s[1024]; //<Data A="Blubb" A="Bla" / ><Data A="Mööp" / >
    size_t len = strlen(s);
    
    for ( size_t i=0, last=-1; i<len; i++ )
    	if ( s[i] == '"' )
    	{
    		if ( last == -1 )
    			last = i;
    		else
    		{
    			s[i] = '\0';
    			cout << s+last+1 << endl;
    			last = -1;
    		}
    	}
    

    Man könnte sagen es wäre zu frickelig, aber man braucht keine Includes (außer für strlen und cout) und es ist relativ verständlich. Ich bin aber überzeugt davon, dass eine bessere Lösung gibt, die dann mit Strings arbeitet. "Besser" im Sinne von schöner 🙂



  • (D)Evil schrieb:

    ja sry .... brauchst noch #include <algorithm> für std::max und std::min und std::strncpy verlangt als 2. Argument den Dest-String und als 3. die Länge ... also 2. und 3. Parameter vertauschen
    =>

    #include <cstring>
    #include <iostream>
    
    unsigned byte arr_byte[1024];
    for (unsigned short n = 0; n < 1014; n += 2)
    {
        char arr_char[3];
        std::strncpy(arr_char, &arr_byte[n], 2);
        std::cout << arr_char << std::endl;
    }
    

    und

    #include <algorithm>
    #include <cstring>
    
    unsigned char buffer[1024];
    int pos1 = std::min(places[0], places[1]); // kleinsten von beiden (damit kann keine negative Zahl rauskommen!)
    int pos2 = std::max(places[0], places[1]); // größten von beiden (damit kann keine negative Zahl rauskommen!)
    char* arr = new char[pos2 - pos1 + 1]; // der string soll die Differenz der beiden Punkte lang sein ...  + 1 für Nullterminierung
    std::strncpy(arr, &buffer[pos1], pos2 - pos1); // die Länge des Strings, ab pos1 aus buffer ...
    std::cout << arr << std::endl; // ausgeben
    delete [] arr; // freigeben ...
    

    dann sollte es aber gehen 🙂

    Ich bekomm immernoch die gleichen Fehler bis auf:

    error C2664: 'strncpy': Konvertierung des Parameters 2 von 'unsigned char *__w64 ' in 'const char *' nicht möglich
    

    Und.. brauch ich denn beides oder reicht das untere?

    Coke



  • hmm das obere ist ein generelles Beispiel und ads untere brauchst du ... macht genau das was du willst ... muss halt nur was anderes damit machen als(wie im Beispiel) nur mit std::cout << ... << std::endl; auszugeben 😉



  • Hmmm... Fehler sind immernoch da 😞
    Nur der letzte hat sich in:

    error C2664: 'strncpy': Konvertierung des Parameters 2 von 'unsigned char *__w64 ' in 'const char *' nicht möglich
    

    geändert



  • Du könntest den entsprechenden Parameter casten



  • Jap, das ist glaub ich nicht ganz das Prob.

    Nur anscheinded fehlt immernoch ein include, da die alten Fehler auch noch da sind.



  • Dann hast du wohl keinen C++-Compiler genutzt. Sind namespaces und somit teil des C++-Standards ...

    edit
    geht in dem Fall aber auch in C ...



  • Hya ! 🕶

    #define PROGGINGMANIAS_BLAH_BLUBB_EXTRACTOR main() // V 0.81 beta   ;-)
    
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    // Proggingmanias blahs and blubss extractor Version 0.81 beta
    int PROGGINGMANIAS_BLAH_BLUBB_EXTRACTOR
    { 
        // Testblubb Buffer
    	char blubberbuff[1024] =  "<Data A=\"Blubb\" A=\"Bla\" / ><Data A=\"Mööp\" / >";
    	int pos1 = 0, pos2 = 0;
    
    	string copy = blubberbuff;				// Blahs and blubbs copy
    	vector <string> blahs_and_blubbs;		// Blahs and blubbs container
    
    	while(1)
    	{
    		pos1 = copy.find( "\"", pos2 +  1 );
    
    		if( pos1 == -1 )
    		{
    			break;
    		}
    
    		pos2 = copy.find( "\"", pos1 + 1 );
    
    		if ( pos2 == -1 ) 
    		{
    			cout << "Error in Token: " << copy << ".  Missing: \"" << endl;
    			break;
    		}
    		blahs_and_blubbs.push_back( copy.substr( pos1+1, pos2 - pos1 - 1 ));
    	}
    
    	// Show the blahs and blubbs !
    	if ( blahs_and_blubbs.size() == 0 )
    	{
    		cout << "Sorry, but there are no blahs and no blubbs available !" << endl;
    	return 0;
    	}
    
    	cout << "Showing blahs: ( and blubbs  ) " << endl;
    	for ( int i = 0; i < blahs_and_blubbs.size(); i++ )
    	{
    		cout << blahs_and_blubbs.at(i) << endl;
    	}
    
        return 0;
    }
    

    Bya ! 🙂


Anmelden zum Antworten