Binären Buffer kopieren?



  • Hallo Forum,

    wie kopiert man unter C++ einen binären Buffer?

    void Aes::SetAesKeyBin(int ByteLength, const char *cAesKeyBin) {
    	char *m_cAesKeyBin=0;
    
    	m_cAesKeyBin = new char[ByteLength];
    	m_cAesKeyBin = cAesKeyBin; // Wie kopiert man n Zeichen von einem Buffer zum anderen?
    }
    

    Die C-String Funktionen kann ich nicht nehmen, weil im Binärstring eine \0 sein könnte. Aus der Winapi wollte ich mich auch nicht unbedingt bedienen.



  • Hallo

    Da ist die C-Funktion memcpy zuständig.

    bis bald
    akari



  • Per Zuweisung kopierst du nicht die Zeichen, sondern biegst nur den Pointer um - das Ergebnis ist auf jeden Fall ein Speicherleck (mit der Chance auf einen späteren Totalabsturz). Zeichen kopieren kannst du mit memcpy(), std::copy() oder stückweise in einer Schleife for(int i=0;i<ByteLength;++i)m_cAesKeyBin[i]=cAesKeyBin[i]; .

    PS: Was für einen Sinn macht die Funktion so, wie sie dort steht?



  • Die Funktion soll einen AES Key in binärer Form bekommen und ihn in eine private Variable kopieren.

    Ich habe Akaris Vorschlag mal angewendet:

    void AES::SetAesKeyBin(unsigned int Length, const char *cAesKeyBin) {
    
    	if (m_cAesKeyBin!=0) {
    		delete m_cAesKeyBin;
    		m_cAesKeyBin=0;
    	}
    
    	m_cAesKeyBin = new char[iBitLength/8];
    	memcpy(m_cAesKeyBin, cAesKeyBin, Length);
    }
    

    Wie sähe das in C++ mit dem Copy aus? Ich finde im Internet nichts passendes.



  • Zuerst mal: delete 0 macht nichts und Du brauchst den Zeiger nicht explizit auf 0 setzen, wenn Du ihn danach sowieso wieder umsetzt.
    Zum zweiten: Nach einem new**[]** brauchst Du ein delete**[]**

    Das und C++-Copy zusammen sähen dann so aus (braucht den Header <algorithm>):

    void AES::SetAesKeyBin(unsigned int Length, const char *cAesKeyBin) {
        delete[] m_cAesKeyBin; // wenn == 0, passiert nichts
    
        m_cAesKeyBin = new char[iBitLength/8]; // ist sichergestellt, dass iBitLength/8 >= Length?
    
        std::copy(cAesKeyBin, cAesKeyBin + Length, m_cAesKeyBin);
    
        // oder du machst aus m_cAesKeyBin ein std::string, dann brauchst Du kein delete, kein new, kein copy...
        m_cAesKeyBin.assign( cAesKeyBin, cAesKeyBin + Length );
    }
    


  • Erstmal solltest du mal deine Variablennamen entknoten (und im oberen Beitrag war m_cAesKeyBin eine lokale Variable, die direkt nach der Zuweisung weggeworfen wurde).

    Zweitens: copy() sieht so ähnlich aus wie memcpy(), nur die Parameter stehen in einer anderen Reihenfolge:

    memcpy(cAesKeyBin, cAesKeyBin+Length, m_cAesKeyBin);
    

    PS: Die Überprüfung des Zeigers und das anschließende NULL-setzen sind übrigens sinnlos 😉



  • Naja, ich wollte Euch nicht mit ellenlangem Source ermüden. Deshalb habe ich einiges weggelassen und improvisiert... das assign von std::string kannte ich noch nicht. So bin ich dann auch char* los.

    Vielen Dank Euch dreien 🙂


Anmelden zum Antworten