XML-RPC Datentyp base64 in CString umwandeln



  • Hallo,

    ich habe mir hier http://xmlrpcpp.sourceforge.net/ unter Downloads das xmlrpc++0.7.zip herunter geladen.
    Darin gibt es eine Klasse XmlRpcValue. Damit schicke ich Anfragen an den Client und erhalte Antworten.
    Mit den Datentypen string, int, double, boolean funktioniert das schon.
    Jetzt erhalte ich jedoch eine Antwort im Datentyp base64 und muss die irgendwie in einen CString bekommen.
    Momentan sieht es so aus:

    CString ergebnis = "";		  // hier soll mal meine Antwort drin sein
    std::string temp;		       // über den kann ich Strings aus XmlRpcValue auslesen und in CString rein packen
    XmlRpcValue request, result;	// Anfrage und Antwort für XmlRpc-Client
    
    // Anfrage-Parameter werden in request eingetragen, Anfrage wird ausgeführt, Ergebnis wird in result bereitgestellt.
    
    temp = result;			      // string-Antwort aus XmlRpcValue auslesen
    ergebnis = temp.c_str();	    // Die Ergebniszeichenkette wäre jetzt im CString, funktioniert.
    

    Jetzt erhalte ich jedoch ein Ergebnis in result im base64-Format, mit dem ich nichts anfangen kann.
    Probiere ich es so wie oben, kommt bei temp = result; eine unbehandelte Ausnahme.
    Wenn ich mit dem Debugger in die Zeile hinein gehen, sehe ich, dass sich die Klasse XmlRpcValue daran stört, einen Wert im Datentyp base64 einem string zuzuweisen.
    Beim Ignorieren von diesem Fehler (geht nur im Debug, Release stürzt ab) erhält man jedoch trotzdem irgendwie in ergebnis eine ordentliche, lesbare xml-Zeichenkette, wird also intern trotzdem richtig umgewandelt...

    Lange Rede kurzer Sinn:
    ich brauche eine Alternative zu
    std::string tmp;
    die base64 aus XmlRpcValue aufnehmen kann und die man dann irgendwie in einen CString umwandeln kann.

    Wäre prima, wenn jemand einen Tipp für mich hat.



  • Base64-Werte kannst du nur als XmlRpcValue::BinaryData rausholen, was ein Typdef auf vector<char> ist.

    Und schau dir mal Base64Decode an.



  • @ MFK:
    vielen Dank mal wieder (das war ja nicht der erste gute Rat, mit dem du mir bei diesem Thema geholfen hast). 👍 🙂

    Und sonst:
    ich habe das jetzt mal so umgebaut:

    CString ergebnis = "";
    // std::string temp;		             // alt
    XmlRpcValue::BinaryData binaryXmlRpc;	// neu
    XmlRpcValue request, result;
    
    // Anfrage-Parameter werden in request eingetragen, Anfrage wird ausgeführt, Ergebnis wird in result bereitgestellt.
    
    // temp = result;			        // alt
    binaryXmlRpc = result;			   // neu
    
    std::vector<char> vecchar;
    vecchar = binaryXmlRpc;
    
    for(int n = 0; n < vecchar.size(); ++n)
    	ergebnis += vecchar[n];
    
    AfxMessageBox(ergebnis);
    

    Keine Fehler, kein Absturz und in der MessageBox zum Schluss steht wieder ein ordentlich lesbares XML drin.

    Ich muss allerdings gestehen, dass ich das mehr geraten als programmiert habe. Daher weiss ich auch nicht, ob da noch irgendwo grobe Fehler drin sind, irgendwelche Speicherbelegungszeitbomben oder so...
    Falls also noch jemand Verbesserungsvorschläge bezüglich Code oder auch Variablennamen hat, nur her damit.



  • isabeau schrieb:

    Keine Fehler, kein Absturz und in der MessageBox zum Schluss steht wieder ein ordentlich lesbares XML drin.

    Oh, dann übernimmt XmlRpcValue::operator BinaryData das Decoding offenbar selbst. Umso besser für dich 😉

    isabeau schrieb:

    Falls also noch jemand Verbesserungsvorschläge bezüglich Code oder auch Variablennamen hat, nur her damit.

    Du musst dir darüber im Klaren sein, dass das so nur funktioniert, wenn der Wert wirklich ein String ist. Base64 dient ja dazu, Binärdaten zu übertragen, d.h. was da drin steht, ist eventuell gar nicht sinnvoll als String darstellbar.



  • Ja, der dekodiert von sich aus 😃
    Bei anderen Beispielen, die so zu finden sind, sind bloss immer noch irgendwelches push_back(...) o.ä. zu finden. Daher hat mich das ein bischen gewundert, dass es anscheinend so wie jetzt auch funktioniert.
    Das ist was ganz anderes, als das, was ich sonst so programmiere, da kenne ich mich nicht wirklich mit aus...


Anmelden zum Antworten