NULL enthaltende Char* kopieren



  • Guten Abend liebe Community,

    ich habe das kleine Problem dass ich eine Binärdatei
    schreiben muss - Wie das öffnen und beschreiben eines binären Filestreams funktioniert ist mir bekannt.

    Ich verwende einen Buffer der in x Runden immer mit y Byte erweitert werden soll, das Problem ist, dass in diesen Buffer auch binäre Nullen kopiert werden sollen.

    char* buffer = new char[n];
    char* abc = new char[y];
    
    for(int i = 0; i < x; i++){
        abc = FUNKTION();
        strcat(buffer, abc);
    }
    
    //Schreibe den Buffer in Datei
    

    Da abc NULL-Terminatoren als Zeichen enthalten kann kann ich strcat nicht verwenden, da diese Funktion an einem solchen Zeichen angekommen die Arbeit abbricht.

    Ich wäre für jede Hilfe dankbar 🙂

    MfG Xeno



  • Was spricht gegen ein paar geile STL-Container?



  • Aua, das ist ja C mit new. Und warum nutzt du C-String Funktionen, wenn du gar nicht mit Strings arbeitest sondern mit Binärdaten?
    Bist du zudem sicher, dass das so soll? Denn bei deinem Code ist z.B. der Speicher auf den abc zeigt verloren, der wird doch nie freigegeben..
    Guck dir mal std::vector und Iteratoren an.



  • Hacker schrieb:

    Was spricht gegen ein paar geile STL-Container?

    "geil"



  • Gegensprechanlage schrieb:

    Hacker schrieb:

    Was spricht gegen ein paar geile STL-Container?

    "geil"

    Mööp Mööp, STL rockt 🕶
    Oder das ist Geschmackssache - ich find auch nicht alles gut.



  • Hmm über einen Vector hatte ich nachgedacht, aber ich weiß nicht wie man den Inhalt in eine Datei schreiben könnte...

    Das ganze soll die Endstufe einer Verschlüsselung werden.
    Die einzelnen Blöcke (immer multiple von 64-Bit) sollen aneinander gehängt und weggeschrieben werden.



  • Xenogenesis schrieb:

    Hmm über einen Vector hatte ich nachgedacht, aber ich weiß nicht wie man den Inhalt in eine Datei schreiben könnte...

    Mit &v[0] oder v.data()? Welchen Algorithmus implementierste denn? AES?



  • @cooky451

    *KMT
    AUTSCH ok da hätte ich wirklich dran denken sollen^^
    Danke für das Öffnen meines geistigen Auges 😃

    Ne nicht AES, ist eine Eigenentwicklung die ich seit fast einem Jahr plane und nun endlich Implementiere

    Vielen Dank euch allen 🙂



  • Xenogenesis schrieb:

    Ne nicht AES, ist eine Eigenentwicklung die ich seit fast einem Jahr plane und nun endlich Implementiere

    Interessant. Ich hoffe du weist entweder was du da tust (irgendwie bezweifel ich das :)), oder du willst den nicht in irgendetwas Sicherheitsrelevantem einsetzen?



  • cooky451 schrieb:

    Xenogenesis schrieb:

    Hmm über einen Vector hatte ich nachgedacht, aber ich weiß nicht wie man den Inhalt in eine Datei schreiben könnte...

    Mit &v[0] oder v.data()?

    Bitte was? C++11? Oder seit wann hat std::vector eine solche Member-Funktion?



  • Hacker schrieb:

    C++11?

    Wie man auch in jeder Referenz nachgucken könnte..



  • Hacker schrieb:

    cooky451 schrieb:

    Xenogenesis schrieb:

    Hmm über einen Vector hatte ich nachgedacht, aber ich weiß nicht wie man den Inhalt in eine Datei schreiben könnte...

    Mit &v[0] oder v.data()?

    Bitte was? C++11? Oder seit wann hat std::vector eine solche Member-Funktion?

    c++11



  • @Xenogenesis
    std::vector<char> wie schon vorgeschlagen wurde ist sicher die bessere Wahl.

    Ansonsten... was spricht gegen memcpy() und selber mitzählen?



  • unskilled schrieb:

    Hacker schrieb:

    cooky451 schrieb:

    Xenogenesis schrieb:

    Hmm über einen Vector hatte ich nachgedacht, aber ich weiß nicht wie man den Inhalt in eine Datei schreiben könnte...

    Mit &v[0] oder v.data()?

    Bitte was? C++11? Oder seit wann hat std::vector eine solche Member-Funktion?

    c++11

    cooky451 schrieb:

    Hacker schrieb:

    C++11?

    Wie man auch in jeder Referenz nachgucken könnte..

    Bei meiner Lieblingsreferenz gab es keine solche Member-Methode. Ich werde jetzt für die nächste Zeit wohl zu cppreference wechseln müssen... ist aktueller.



  • Ja mit dem Vector funktioniert es dann auch 😃

    Also sagen wir so, das ganze kommt in mehreren Applikationen und auch Projekten anderer zum Einsatz.



  • Was spricht gegen etwas wie AES, das auch sicher funktioniert?
    Wie ist dein Background in Zahlentheorie etc? Kannst du formell die Sicherheit deines Algorithmus beweisen?



  • Xenogenesis schrieb:

    char* buffer = new char[n];
    char* abc = new char[y];
    
    for(int i = 0; i < x; i++){
        abc = FUNKTION();
        strcat(buffer, abc);
    }
    

    Das ist echt wenig an Code. Wie sieht FUNCTION aus? Warum reservierst du per new[] Speicher und überschreibst den Zeiger später mit "abc="? Warum überhaupt new[]?

    Tipp: Wenn du glaubst, new[] und delete[] benutzen zu müssen, liegst du sehr wahrscheinlich falsch.

    #include <iterator>
    #include <vector>
    #include <iostream>
    
    template<class OutputIterator>
    void func(OutputIterator oi)
    {
      *oi++ = 'W';
      *oi++ = 'T';
      *oi++ = 'F';
      *oi++ = '?';
      *oi++ = '!';
    }
    
    int main()
    {
      using namespace std;
      vector<char> buffer;
      for(int i = 0; i < 5; i++) {
        func(back_inserter(buffer));
      }
      buffer.push_back('\0');
      cout << &buffer[0] << endl;
    }
    


  • Ethon schrieb:

    Was spricht gegen etwas wie AES, das auch sicher funktioniert?
    Wie ist dein Background in Zahlentheorie etc? Kannst du formell die Sicherheit deines Algorithmus beweisen?

    AES ist aber keine Vollbitverschlüsselung! 🤡



  • Xenogenesis schrieb:

    char* buffer = new char[n];
    

    hustbaer schrieb:

    std::vector<char> wie schon vorgeschlagen wurde ist sicher die bessere Wahl.

    Ich will nicht kleinlich sein. Aber sollten binäre Daten nicht in unsigned char s dargestellt werden?



  • pumuckl schrieb:

    Ich will nicht kleinlich sein. Aber sollten binäre Daten nicht in unsigned char s dargestellt werden?

    Sollten - ist aber ziemlich unüblich. Siehe z.B. ifstream::read, memcpy, etc.


Anmelden zum Antworten