Konvertierung von 'string' nach 'unsigned char[]'



  • hallo,
    ja wie geht das?

    ich möchte einen registry wert schreiben. also:
    BYTE blah[] = DieStringVariable;



  • Hallo,

    ich versteh nicht ganz was du willst. Im Text schreibst du BYTE = string. Das funktioniert meines erachtens nicht. Ein char (also ein einzelnes Zeichen) kann als Byte betrachtet werden, aber kein String.

    In der Überschrift willst du aber string nach unsigned char, das ist wieder was anderes. Für string nach char* funktioniert das

    String* origin = "test";
    char* dest;
    
    dest = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( origin );
    


  • Willst Du den Inhalt des Strings in ein BYTE-Array kopieren, oder was genau meinst Du? Wenn ja, dann würde ich memcpy aus cstring nehmen:

    string test = "Test";
    BYTE buffer[50];
    memcpy(buffer, test.c_str());
    

    (Musst natürlich aufpassen, dass buffer groß genug ist (evtl. dynamisch reservieren) , usw.)



  • hallo
    JohnDoe, Asgard hat verstanden was ich wollte.
    allerdings klappt das nicht ganz. der compiler meldet mir

    Keine Übereinstimmung für 'memcpy(unsigned char *,const char *)' gefunden



  • Hmm,

    welchen Compiler benutzt du ? Evtl. musst du noch <cstring> einbinden.



  • ist CString nicht von der MFC? ich gehe eigentlich den ANSI/ISO standard, also #include <string> das hat aber keinen einfluss ob cstring oder string



  • ach, ich musste ja bei memcpy noch die anzahl bytes angeben. jetzt klappt das. danke nochmals dazu. doch eine weitere frage hätte ich. ich hab das nun provisorisch so gelöst:

    BYTE buffer[255]; 
    memcpy(buffer, test.c_str(),255);
    

    was ich jetzt gerne machen würde ist, die grösse vom buffer-array wie asgard bereits erwähnt hat, dynamisch reservieren. bei memcpy das gleiche. ich hab das folgendermasse mit dem schlüsselwort sizeof versucht, doch sizeof liefert nur die grösse der variable, sehe ich das richtig?

    std::string test = "eins zwei drei vier....";
    
    BYTE buffer[sizeof(test)]; 
    memcpy(buffer, test.c_str(),sizeof(test));
    


  • Bei einem basic_string kannst du mittels der Memberfunktion size() die anzahl der Elemente im string zurück geben lassen.
    Ausserdem funktioniert folgendes nicht da du schon selbst erkannt hast sizeof nicht die länge des Strings zurückliefert, ausserdem muss bei einem array die größe zur Compilezeit feststehen.

    BYTE buffer[sizeof(test)]; // Falsch, da sizeof nicht die größe des strings zurückgibt.
    BYTE buffer[test.size()]; // Falsch, da die größe eine arrays zur Compilezeit feststehen muss.
    

    Willst du wirklich einen dynamischen array musst du new[] benutzen, oder du greifst auf die STL zurück.

    Bsp:

    // ...
    std::string str = "ABC def GHI";
    char *pCh = new char[str.size() + 1]; // Speicher allokieren, nicht das zusätliche
                                          // Byte für die Nulltermination vergessen.
    
    memcpy(pCh, str.c_str(), str.size()); // Hier wird kopiert
    
    delete[] pCh;                         // Nicht vergessen den Speicher wieder
                                          // freizugeben!!!
    // ...
    

    Gruß Wolle



  • Thomas Kau. schrieb:

    ist CString nicht von der MFC? ich gehe eigentlich den ANSI/ISO standard, also #include <string> das hat aber keinen einfluss ob cstring oder string

    Nein, ist nicht MFC. cstring ist string.h der c-bibleothek, die in ein
    extern "C" gepackt wurde.


Anmelden zum Antworten