[Qt] QByteArray wird nicht eingelesen



  • Hallo,
    Habe 2 Fragen bezüglich QByteArrays:

    Erste Frage:
    Seit ein paar Stunden versuche ich schon, eine Datei in ein QByteArray zu laden.
    Nur will das nicht funktionieren. Seltsamerweise funktioniert es, wenn ich in der nächsten Zeile das Array in einem PlainTextEdit ausgeben will.

    void MainWindow::on_pushButton_2_clicked()
    {
        QFile file("D://RAM Dumps/botw07_3F800000.bin");
        if(!file.open(QIODevice::ReadOnly))
        {
            ui->label_2->setText("error");
        }
    
        QDataStream in (&file);
        QByteArray dump = file.readAll(); // Möchte die Datei in dieses QByteArray ablegen
        //ui->plainTextEdit->setPlainText(dump); // Ist das nicht auskommentiert, funktioniert es
    }
    

    Allerdings möchte ich die Datei einfach nur im Arbeitsspeicher ablegen und nicht in einem Textfeld.
    Beobachte ich die Speicherauslastung im Taskmanager sehe ich, dass, wenn push_button_2 geklickt wird, die Auslastung kurz auf 933MB springt, was in etwa der Größe der Datei entspricht. Dann fällt die Auslastung wieder auf 4,4MB.
    Kann mir jemand weiterhelfen?

    Habe noch das ausprobiert, Resultat ist das selbe:

    void MainWindow::on_pushButton_2_clicked()
    {
        QFile *file = new QFile("D://RAM Dumps/botw07_3F800000.bin");
        if(!file->open(QIODevice::ReadOnly)) //
        {
            ui->label_2->setText("error");
        }
    
        QByteArray dump;// = file.readAll();
        dump = file->readAll();
        //file->close();
    }
    

    Zweite Frage:
    Sollte es irgendwie klappen, wir kann ich die Adresse des ersten Bytes des Arrays in eine Variable speichern?
    Mit Integern und Strings weiß ich, wie das geht. Aber nicht mit QByteArrays.

    Danke



  • Hi,

    das liest sich so, als ob alles so funktioniert wie es soll.

    Aber du legst dein QByteArray lokal in der Funktion "on_push_button2()" an. Das heißt, der Speicher wird beim verlassen der Funktion wieder frei gegeben.

    Zu deiner zweiten Frage, meinst du sowas:

    char* c = &dump[0];
    

    Wofür brauchst du sowas? QByteArray hat Iteratoren implementiert, die geben dir im Prinzipt das was du willst. Die kannst du auch speichern und weiter geben, wenn du möchtest:

    auto iter = dump.begin();
    


  • Achso, das macht Sinn. Kann man verhindern, dass der Speicher wieder freigegeben wird? Habe den Code in die main.cpp kopiert und die Datei blieb im Speicher. Aber so kann ich später nicht dynamisch die Datei aussuchen. (Der fest definierte Dateipfad dient nur zum Testen).

    Das ganze soll dazu dienen, dass ich in RAM-Dumps nach Pointer suchen kann. Dabei soll erst ein Dump eingelesen werden, dieser nach möglichen Pointer durchsucht werden. Der Dump soll erst aus dem Speicher verschwinden, wenn ein neuer geladen wird, um die Ergebnisse zu filtern.

    Und die Zweite Frage hat sich mit Deiner Antwort geklärt. Ich war mir nicht sicher, welche Datentyp ich für den Pointer bei einem QByteArray nutzen soll.
    Danke 😃



  • KratzKatz schrieb:

    Achso, das macht Sinn. Kann man verhindern, dass der Speicher wieder freigegeben wird?

    Ja, kann man. An der Stelle würde ich dir zum einen ein Buch über C++ empfehlen und zum anderen ein Buch über (objekorientiertes) Software Design.

    Kurz gesagt, es gibt zwei Möglichkeiten. Entweder du machst dein QByteArray zu einem Member in einer entsprechenden Klassenstruktur, oder du allozierst Speicher auf dem Heap. (Such mal nach Smartpointern).

    KratzKatz schrieb:

    Habe den Code in die main.cpp kopiert und die Datei blieb im Speicher. Aber so kann ich später nicht dynamisch die Datei aussuchen. (Der fest definierte Dateipfad dient nur zum Testen).

    Wie gesagt, Software Design ist das Stichwort.

    KratzKatz schrieb:

    Das ganze soll dazu dienen, dass ich in RAM-Dumps nach Pointer suchen kann. Dabei soll erst ein Dump eingelesen werden, dieser nach möglichen Pointer durchsucht werden. Der Dump soll erst aus dem Speicher verschwinden, wenn ein neuer geladen wird, um die Ergebnisse zu filtern.

    Das ganze versteh ich noch nicht. Du willst eine Datei laden und schauen ob an irgendwelchen Stellen Pointer auf andere Speicherbereiche stehen? Ich fürchte, das funktioniert alles nicht so, wie du dir das vorstellst und du solltest noch etwas in grundlagen Arbeit investieren. Als kleiner Startpunkt: https://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung



  • Schlangenmensch schrieb:

    Ja, kann man. An der Stelle würde ich dir zum einen ein Buch über C++ empfehlen und zum anderen ein Buch über (objekorientiertes) Software Design.

    Ich habe ein C++ Buch (siehe hier). Aber objektorientierte Programmierung wird nicht so tief eingegangen. Welches Buch wäre da empfehlenswert?

    Schlangenmensch schrieb:

    Kurz gesagt, es gibt zwei Möglichkeiten. Entweder du machst dein QByteArray zu einem Member in einer entsprechenden Klassenstruktur, oder du allozierst Speicher auf dem Heap. (Such mal nach Smartpointern).

    Das ganze versteh ich noch nicht. Du willst eine Datei laden und schauen ob an irgendwelchen Stellen Pointer auf andere Speicherbereiche stehen? Ich fürchte, das funktioniert alles nicht so, wie du dir das vorstellst und du solltest noch etwas in grundlagen Arbeit investieren. Als kleiner Startpunkt: https://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung

    Es gibt schon einige solcher Tools, nur hat keines dieser Support für 64-bit-Pointer. Wenn doch, dann keine Möglichkeit zwischen LE und BE zu schwitchen.
    Um es genauer zu erklären:
    Ich lese von diversen Spielekonsolen den Arbeitsspeicher aus und suche/filtere nach bestimmten Kriterien nach Werten. Oft ist es so, dass, wenn man das Speil neustartet oder ein anderes Level geladen wurde, die Speicheradressen nicht mehr dieselben sind. Dann vergleicht man mindestens 2 RAM-Dumps und sucht nach Pointern die auf oder in die Nähe des Ziels verweisen (oder Pointer, die auf Pointer verweisen).
    Dabei muss jedes Double-Word bzw. Quad-Word geprüft werden, ob es sich um einen Pointer handeln könnte, dieser in die Nähe der Zieladresse verweist und es sich im anderen Dump immernoch so verhält.



  • KratzKatz schrieb:

    Ich habe ein C++ Buch (siehe hier).

    Da haben wir das Problem... 😉



  • icarus2 schrieb:

    KratzKatz schrieb:

    Ich habe ein C++ Buch (siehe hier).

    Da haben wir das Problem... 😉

    Das musst du mir nicht sagen 😃
    Ich habe es auf Seite gelegt, weil es nach den ersten 80 Seiten einfach nur trocken weitergeht



  • KratzKatz schrieb:

    Ich habe ein C++ Buch (siehe hier). Aber objektorientierte Programmierung wird nicht so tief eingegangen. Welches Buch wäre da empfehlenswert?

    Ich selbst habe in die Bücher vom Wolf noch nicht reingeschaut, habe aber auch noch nix gutes dazu gehört 😉

    Hier ein paar Links zu und über Bücher:
    Bücher von Jürgen Wolf sind zum Lernen ungeeignet
    Bücher und Tutorials zu C++
    The definitice c++ book guide and list.

    KratzKatz schrieb:

    Es gibt schon einige solcher Tools, nur hat keines dieser Support für 64-bit-Pointer. Wenn doch, dann keine Möglichkeit zwischen LE und BE zu schwitchen.
    Um es genauer zu erklären:
    Ich lese von diversen Spielekonsolen den Arbeitsspeicher aus und suche/filtere nach bestimmten Kriterien nach Werten. Oft ist es so, dass, wenn man das Speil neustartet oder ein anderes Level geladen wurde, die Speicheradressen nicht mehr dieselben sind. Dann vergleicht man mindestens 2 RAM-Dumps und sucht nach Pointern die auf oder in die Nähe des Ziels verweisen (oder Pointer, die auf Pointer verweisen).
    Dabei muss jedes Double-Word bzw. Quad-Word geprüft werden, ob es sich um einen Pointer handeln könnte, dieser in die Nähe der Zieladresse verweist und es sich im anderen Dump immernoch so verhält.

    Ah, ok. Ich dachte du wolltest aus deinem Tool in irgendwelchen Speicherbereichen deines Computers rum lesen.



  • Schlangenmensch schrieb:

    Ich selbst habe in die Bücher vom Wolf noch nicht reingeschaut, habe aber auch noch nix gutes dazu gehört 😉

    Hier ein paar Links zu und über Bücher:
    Bücher von Jürgen Wolf sind zum Lernen ungeeignet
    Bücher und Tutorials zu C++
    The definitice c++ book guide and list.

    Ich schaue mal, welches ich mir noch zulege. Habe mir aber schonmal die PDFs zu Thinking in C++, die kostenfrei angeboten werden runtergeladen.
    Mir fällt noch ein, dass ich ein Buch über C++ mit Unreal Engine habe. Auch wenn es sich auf UE4 bezieht, ist es besser zu lesen als das von Jürgen Wolf. Aber ich möchte mich erst mit UE4 näher befassen, wenn ich vertrauter mit C++ allgemein bin.

    Schlangenmensch schrieb:

    Ah, ok. Ich dachte du wolltest aus deinem Tool in irgendwelchen Speicherbereichen deines Computers rum lesen.

    Dafür nutze ich Cheat Engine 😉



  • Hab mich heute dem Projekt nochmal zugewandt und es geschafft, dass der RAM-Dump im Speicher bleibt.
    Habe das QByteArray unter public: im Header deklariert. Ebenso wie das char* für den Pointer.
    In der Funktion wird der Dump geladen. Nur klappt das mit dem Pointer nicht so ganz. Die Fehlermeldung ist, dass von QByteRef nicht zu einem char* konvertiert werden kann.

    Der besagte Teil der Header-Datei:

    public:
        QByteArray  dump;
        __int64 dump_start_pointer;
    

    Die Funktion in der .cpp

    void MainWindow::on_pushButton_2_clicked()
    {
            QFile file("D://RAM Dumps/120_d1.bin");
            if(!file.open(QIODevice::ReadOnly))
            {
                ui->label_2->setText("error");
            }
            QDataStream in (&file);
            dump = file.readAll();
            char *dump_start = &dump[0]; // Fehler: C2440: 'initializing': cannot convert from 'QByteRef *' to 'char *'
            dump_start_pointer = reinterpret_cast<__int64>(dump_start);
            ui->label_2->setText(QString::number(dump_start_pointer, 16)); // zum testen ausgeben
    }
    

    Hab in der Qt-Dokumentation rumgelesen und, wenn ich das richtig verstehe, soll das QByteArray::data() können.

    EDIT: Habs mit char *dump_start = dump.data(); lösen können 🙂


Anmelden zum Antworten