C++/Qt: Hexfile editieren

Teukron

Grünschnabel
Hi

Ich habe mittels Qt eine Art HexEditor erstellt. Dabei werden nur bestimmte benötigte Dateien aus dem Hexfile gelesen und tabellarisch dargestellt.
Beim Speichern sollten also die veränderten Werte im File geändert werden.

Ich habe es so hingekriegt, dass ich die Werte in der Spalte ganz rechts (siehe hexfile.jpg) mit QTextStream direkt verändern kann.
Dazu wird der Wert als int einem QString übergeben, welcher dann das ASCII-Zeichen des Wertes enthält.

Schreibe ich dieses Zeichen von Hand im Hexfile ganz rechts rein, erscheint im Hexteil der richtige Wert.
Mit dem folgenden Code klappt das oft auch, je nach Wert, werden aber zusätzliche Zeichen ins File geschrieben. Dabei ist die Ausgabe von qDebug() aber immer das ASCII-Zeichen, welches ins File geschrieben werden müsste.

Code:
QString ascii = QString( valueDecimal );

qDebug() << ascii;

QTextStream stream(&file);
stream << ascii;

Ich nehme an, das dies sowieso nicht die schöne Art ist, ein Hexfile zu editieren. Deshalb die Frage:

Wie stelle ich es an, in einem Hexfile, einzelne Werte (nach Adresse) zu verändern?
 

Anhänge

  • hexfile.jpg
    hexfile.jpg
    17,2 KB · Aufrufe: 47
Hi.

Hast du die Datei auch im Binärmodus geöffnet?

Und wenn du die Datei nicht als Text verarbeitest, solltest du besser einen QDataStream verwenden oder einfach nur QFile mit seek, read, write verwenden.

Gruß
 
Ich kann im khexedit unter Ansicht einstellen, dass mir die Daten binär angezeigt werden, aber wie hilft mir das?

Das Problem bei QDataStream oder dem write Befehl von QFile ist, dass ich nicht darauf komme, wie ich die Daten übergeben muss, damit sie richtig ins File geschrieben werden.

Ich habe Folgendes versucht:
Code:
QFile lFile( this->mFilename );
if( lFile.exists() && lFile.open(QIODevice::WriteOnly) )
{       
            if( lFile.seek( addressDecimal ) )
            {
               QString ascii = QString( valueDecimal );  //Bsp: valueDecimal = 255

               qDebug() << ascii; // im Beispiel: ÿ

               QTextStream stream(&file);
               stream << ascii;


Versuche ich es so,
Code:
               QDataStream lStream(&lFile);
               lStream << ascii;
erscheinen im File mehrere Werte. Vermutlich sollte ich hier keinen QString übergeben, aber was sonst ist mir nicht klar.
 
Hallo,

QDataStream ist hier nur bedingt geeignet, da der <<-Operator auch noch Metadaten in das Ausgabegerät schreibt. Umgehen kann man dies mit der Methode QDataStream::writeRawData – aber da kann man auch gleich QIODevice::write verwenden und spart sich den Umweg. Probier es daher mal so:
C++:
qint8 data = static_cast<qint8>(valueDecimal);
lFile.write(reinterpret_cast<char *>(&data), 1);

Grüße,
Matthias
 
Zuletzt bearbeitet:
Zurück