Vinnaren i pepparkakshustävlingen!
2024-07-17, 20:20
  #1
Medlem
Hej!


Jag har flera binära filer (som är typen sparfiler) som är skapade genom QDataStream. Filen har, för mig, okända datatyper och struktur. Hur kan jag läsa av filerna?

Min början är:

Kod:
#include <QCoreApplication>
#include <QTextStream>
#include <QDataStream>
#include <QString>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QByteArray>

void readFile(QString path){
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly)){
        qWarning() << file.errorString();
        return;

    }
    QFileInfo fileinf(file);
    qInfo() << fileinf.fileName() << fileinf.size();

    QDataStream in (&file);
    QByteArray ba(32,0);
    in >> ba;
    qInfo() << ba;

    file.close();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString path = QDir::currentPath() + QDir::separator() + "joe.blr";
    qInfo() << path;
    readFile(path);
    return a.exec();
}

Men det enda jag får ut är:
Kod:
"/home/opt/qt-projects/test/build/Desktop_Qt_6_7_2-Debug/joe.blr"
"Joe.blr" 450
" "

Koden som jag försöker efterlikna är denna röra av pseudo:
Citera
2024-07-17, 21:26
  #2
Avslutat konto
Har du provat
Kod:
$xxd
eller
Kod:
$strings
för att se om du kan få nåt hum om hur datan ser ut?

Din kod verkar btw göra exakt vad du ber den om nu: dumpa ut filnamn och filens storlek.
Kod:
qInfo() << fileinf.fileName() << fileinf.size();

Ett sätt kan vara att reversera binärformatet genom att försöka läsa datatyp för datatyp, byte/chunk för sig.
Citera
2024-07-17, 21:42
  #3
Medlem
Jag får träffar på integer, dock talar xxd för att det finns strängar i den som inte strings plockar upp.


Citat:
Ursprungligen postat av 28k8
Har du provat
Kod:
$xxd
eller
Kod:
$strings
för att se om du kan få nåt hum om hur datan ser ut?

Din kod verkar btw göra exakt vad du ber den om nu: dumpa ut filnamn och filens storlek.
Kod:
qInfo() << fileinf.fileName() << fileinf.size();

Ett sätt kan vara att reversera binärformatet genom att försöka läsa datatyp för datatyp, byte/chunk för sig.

Ja, den delen av koden gör som de ska göra. Det är liksom inte den koden jag har problem med. Om du läser pseudokoden (som du skulle göra innan du svarade) ser du att ett program läser av QDataStream och in till QStrings. Men jag får inte det att fungera.
__________________
Senast redigerad av Methos 2024-07-17 kl. 21:57.
Citera
2024-07-24, 18:00
  #4
Medlem
Jag kan tydligt identifiera strängar i Ghidra i en fil jag försöker läsa från. Men jag får inte fram strängarna i något mer än hex.

Kod:
void readFile(QString path){
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly)){
        qWarning() << file.errorString();
        return;

    }


    QFileInfo fileinf(file);
    qInfo() << fileinf.fileName() << fileinf.size();

    QDataStream in(&file);
    //in.setVersion(QDataStream::Qt_5_15); // Ensure the correct version is set

    QByteArray data(512,0);

    in.readRawData(data.data(), data.size());


    QByteArrayList dataList;

//0x20 = "-" separator
    foreach (auto item, data.split(0x2d)) {
        dataList << item.toHex();
    }

    QByteArray slice_data;

    slice_data = dataList[1];
    qInfo()  <<< slice_data;
      file.close();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString path = QDir::currentPath() + QDir::separator() + "s.dat";
    qInfo() << path;
    //writeFile(path);
    readFile((path));

    return a.exec();
}

output:
Kod:
00 00 00 01 00 00 00 06 00 4a 00 6f 00 65 00 00 00 0c 00 54 00 72 00 65 00 61 00 6d 00 2e 00 00 00 00 00 00 00 01 00 00 00 0a 00 34 00 20 00 31 00 2f 00 32 00 00 00 0a 00 34 00 20 00 31 00 2f 00 32 00 00 00 06 00 31 00 2f 00 34 00 00 00 0a 00 33 00 31 00 2f 00 33 00 32 00 00 00 02 00 32 00 00 00 06 00 33 00 2f 00 38 00 00 00 08 00 

Kod:
13 b8 ff 2d 00 00 00 01 00 00 00 06 00 4a 00 6f 00 65 00 00 00 0c 00 54 00 72 00 65 00 61 00 6d 00 2e 00 00 00 00 00 00 00 01 00 00 00 0a 00 34 00 20 00 31 00 2f 00 32 00 00 00 0a 00 34 00 20 00 31 00 2f 00 32 00 00 00 06 00 31 00 2f 00 34 00 00 00 0a 00 33 00 31 00 2f 00 33 00 32 00 00 00 02 00 32 00 00 00 06 00 33 00 2f 00 38 00 00 00 08 00 2d 00 31 00 2f 00 34 00 00 00 0a 00 33 00 31 00 2f 00 33 00 32 00 00 00 02 00 32 00 00 00 08 00 2d 00 33 00 2f 00 38 00 00 00 08 00 2d 00 31 00 2f 00 38 00 00 00 0a 00 32 00 39 00 2f 00 33 00 32 00 00 00 02 00 33 00 00 00 08 00 31 00 2f 00 31 00 36 00 00 00 0a 00 2d 00 31 00 2f 00 31 00 36 00 00 00 06 00 34 00 2e 00 35 00 00 00 06 00 30 00 2e 00 35 00 00 00 0a 00 32 00 33 00 2f 00 33 00 32 00 00 00 0a 00 31 00 31 00 2f 00 31 00 36 00 00 00 0a 00 31 00 20 00 31 00 2f 00 34 00 00 00 04 00 31 00 35 00 00 00 08 00 30 00 2e 00 31 00 38 00 00 00 04 00 31 00 30 00 00 00 08 00 30 00 2e 00 37 00 34 00 00 00 04 00 31 00 35 00 00 00 02 00 30 00 00 00 04 00 31 00 38 00 00 00 06 00 30 00 2e 00 35 00 00 00 06 00 33 00 30 00 30 00 00 00 02 00 38 00 00 00 04 00 36 00 30 00 00 00 02 00 36 00 00 00 04 00 32 00 30 00 00 00 02 00 36 00 00 00 02 00 33 00 00 00 06 00 30 00 2e 00 33 00 00 00 06 00 34 00 2e 00 35 00 00 00 08 00 30 00 2e 00 31 00 34 00 00 00 06 00 30 00 2e 00 35 00 00 00 08 00 30 00 2e 00 31 00


. . . - . . . . . . . . . J . o . e . . . . . T . r . e . a . m . . . . . . . . . . . . . . . 4 .   . 1 . / . 2 . . . . . 4 .   . 1 . / . 2 . . . . . 1 . / . 4 . . . . . 3 . 1 . / . 3 . 2 . . . . . 2 . . . . . 3 . / . 8 . . . . . - . 1 . / . 4 . . . . . 3 . 1 . / . 3 . 2 . . . . . 2 . . . . . - . 3 . / . 8 . . . . . - . 1 . / . 8 . . . . . 2 . 9 . / . 3 . 2 . . . . . 3 . . . . . 1 . / . 1 . 6 . . . . . - . 1 . / . 1 . 6 . . . . . 4 . . . 5 . . . . . 0 . . . 5 . . . . . 2 . 3 . / . 3 . 2 . . . . . 1 . 1 . / . 1 . 6 . . . . . 1 .   . 1 . / . 4 . . . . . 1 . 5 . . . . . 0 . . . 1 . 8 . . . . . 1 . 0 . . . . . 0 . . . 7 . 4 . . . . . 1 . 5 . . . . . 0 . . . . . 1 . 8 . . . . . 0 . . . 5 . . . . . 3 . 0 . 0 . . . . . 8 . . . . . 6 . 0 . . . . . 6 . . . . . 2 . 0 . . . . . 6 . . . . . 3 . . . . . 0 . . . 3 . . . . . 4 . . . 5 . . . . . 0 . . . 1 . 4 . . . . . 0 . . . 5 . . . . . 0 . . . 1 .
Citera
2024-07-26, 12:11
  #5
Medlem
Hrass avatar
Ditt problem är inte "okänd struktur" utan att du inte vet hur man läser från en fil...
Du har kända bytes, du vet hur du vill tolka dem, ändå går det inte? Ja, då sätter du en brytpunkt efter första läsningen och stämmer av med vad du läst in och vad som finns härnäst i strömmen.

QString är väl wide (UTF-16, dvs. verkar passa med dina bytes) så det som ställer till är nog att du blir förskjuten av bytes innan
Citera
2024-07-26, 18:27
  #6
Medlem
Citat:
Ursprungligen postat av Hras
Ditt problem är inte "okänd struktur" utan att du inte vet hur man läser från en fil...
Du har kända bytes, du vet hur du vill tolka dem, ändå går det inte? Ja, då sätter du en brytpunkt efter första läsningen och stämmer av med vad du läst in och vad som finns härnäst i strömmen.

QString är väl wide (UTF-16, dvs. verkar passa med dina bytes) så det som ställer till är nog att du blir förskjuten av bytes innan

Tack för din omtanke...

Men jag löste det själv efter "en stund";

Kod:
QDataStream in(&file);
    QString string3;

    //TODO: output a QMap instead of QList
    QStringList strings;

    while(!in.atEnd()){
        in >> string3;
        strings.append(string3.toUtf8());
    }

    file.close();

Felet låg i att jag missförstod hur QString fungerade i den här situationen. Jag behövde inte använda en buffer i det här fallet.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in