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.
-
-
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
