unsigned char* to stringstream



  • Hallo,

    ich habe ein unsigned char* in einen stringstream bekommen und weiß aber nicht, wie ich es zurück bekomme.

    stringstream ss;
    unsigned char* out;
    // etwas in out reinschreiben
    ss << out;
    // und jetzt wieder zurück von ss in out
    ss >> out;
    

    beim letzten schritt, bekomme ich immer eine zugriffsverletztung

    es währe schön, wenn mir jemand sagen/zeigen könnte, wie es geht.

    mfg
    gucky



  • #include <iostream>
    #include <sstream>
    
    int main()
    {
    	unsigned char *B = reinterpret_cast<unsigned char *>("TesT");
    
    	std::stringstream ss;
    	ss << B << "blabla" << B; // Mach was mit B
    
    	std::string tmp = ss.str(); // Umweg über eine Istanz von std::string ist notwendig, da nur so ein längerer Zugriff über c_str() möglich ist (Gültigkeitsbereich)
    
    	const unsigned char *Z = reinterpret_cast<const unsigned char *>(tmp.c_str()); // Char-Array besorgen (Achtung: const!). Vom Wegcasten ist absolut abzuraten!!!
    
    	std::cout << Z << std::endl; // Mach was damit...
    
    	// Z ist nicht mehr gültig, wenn der Gültigkeitsbereich von tmp zu ende geht, da der std::string den C-String unterhält
    
    	return 0;
    }
    

    Ich bin mir sicher, dass es einen besseren Weg gibt. Wie du am Code und vorallem an den Kommentaren siehst ist das sehr riskant...

    Was hast du also genau vor?


  • Mod

    Das ist an sich kein Problem:

    #include <sstream>
    #include <iostream>
    
    using namespace std;
    
    void foo(unsigned char *a)
    {
      stringstream b;
      b<<a;
      b>>a; // Liest wie immer bei Zeichenketten nur das erste Wort
    }
    
    int main()
    {
      unsigned char a[]="Hallo Welt";  // Beschreibbarer Speicherplatz
      foo(a);
      cout<<a<<endl;  // Enthält jetzt nur noch "Hallo"
    }
    

    Du hast vermutlich versucht, in einen nicht beschreibbaren Speicherbereich zu lesen.

    @löälöä: Deine Lösung ist unnötig kompliziert und macht viele Annahmen die vom Standard nicht garantiert werden. Gucky hat vermutlich bloß keine Ahnung von manueller Speicherverwaltung (und ich wette, er bräuchte sie auch gar nicht).



  • das problem ist, dass ich eine funktion einer lib (datenkompression) habe, die ein unsigned char* erwartet, und diese gibt auch ein unsigned char* zurück.
    jetzt möchte ich diesen wert speichern (in einer datei) und später wieder dekompressieren mit einer funktion, die auch ein unsigned char* erwartet.



  • SeppJ schrieb:

    @löälöä: Deine Lösung ist unnötig kompliziert und macht viele Annahmen die vom Standard nicht garantiert werden. Gucky hat vermutlich bloß keine Ahnung von manueller Speicherverwaltung (und ich wette, er bräuchte sie auch gar nicht).

    Was für Annahmen?



  • Gucky schrieb:

    stringstream ss;
    unsigned char* out;
    // etwas in out reinschreiben
    ss << out;
    // und jetzt wieder zurück von ss in out
    //ss >> out;
    strcpy(out, ss.str().c_str());
    

  • Mod

    ,-,.- schrieb:

    SeppJ schrieb:

    @löälöä: Deine Lösung ist unnötig kompliziert und macht viele Annahmen die vom Standard nicht garantiert werden. Gucky hat vermutlich bloß keine Ahnung von manueller Speicherverwaltung (und ich wette, er bräuchte sie auch gar nicht).

    Was für Annahmen?

    Ok auf den zweiten Blick gesehen ist es, so wie es da steht, standardkonform, aber auf sehr sehr wackeligen Füßen. Winzigste Änderungen am Programm würden undefiniertes Verhalten hervorrufen. Und es ist höchstwahrscheinlich nicht das was Gucky möchte.



  • Belli schrieb:

    Gucky schrieb:

    stringstream ss;
    unsigned char* out;
    // etwas in out reinschreiben
    ss << out;
    // und jetzt wieder zurück von ss in out
    //ss >> out;
    strcpy(out, ss.str().c_str());
    

    Wenn aber etwas angehangen oder ähnliches wurde, dann passt es mit der Größe nicht mehr.

    Falls die Größe eh konstant bleibt, dann ist der Umweg über std::stringstream eh unsinnig...



  • Gucky schrieb:

    das problem ist, dass ich eine funktion einer lib (datenkompression) habe, die ein unsigned char* erwartet, und diese gibt auch ein unsigned char* zurück.
    jetzt möchte ich diesen wert speichern (in einer datei) und später wieder dekompressieren mit einer funktion, die auch ein unsigned char* erwartet.

    Wieso willst du dabei über einen stringstream gehen, speicher den Kram doch einfach direkt in einer Datei:

    std::ofstream File( "Datei.bin", std::ios::binary );
    unsigned char* Compressed = ...;
    int Size = ...;
    File.write( reinterpret_cast<char*>(Compressed), Size );
    

Anmelden zum Antworten