Problem mit Binärdaten

Alles rund um die Programmierung mit Qt
Antworten
chom
Beiträge: 24
Registriert: 13. Januar 2012 20:02

Problem mit Binärdaten

Beitrag von chom »

Hallo,
Ich versuche gerade Dateien binär einzulesen und als Hex auszugeben, aber ich habe folgendes Problem:
Zwar klappt es bei den meisten Dateien aber z.B. bei Bilder etc. nicht:
Zwar wird die Datei eigelesen, aber irgendwie stimmt da was nicht (die ganzen FFFF...) man sieht an der magischen Zahl das es eine PNG Datei ist (ist im Anhang). Jetzt die Frage: Was habe ich falsch gemacht?

DANKE schon mal :D
FFFFFFFFFFFFFF89 50 4E 47 0A 1A 0A 00 00 00 49 48 44 52 00 00
00 04 00 00 00 04 08 02 00 00 00 26 FFFFFFFFFFFFFF93 09 29 00
00 00 01 73 52 47 42 00 FFFFFFFFFFFFFFAE FFFFFFFFFFFFFFCE 1C FFFFFFFFFFFFFFE9 00 00 00 09
70 48 59 73 00 00 0B 13 00 00 0B 13 01 00 FFFFFFFFFFFFFF9A FFFFFFFFFFFFFF9C
18 00 00 00 07 74 49 4D 45 07 FFFFFFFFFFFFFFDC 02 1A 01 09 2E
FFFFFFFFFFFFFFE0 FFFFFFFFFFFFFF9A 4E FFFFFFFFFFFFFFDE 00 00 00 1D 69 54 58 74 43 6F 6D 6D
65 6E 74 00 00 00 00 00 43 72 65 61 74 65 64 20
77 69 74 68 20 47 49 4D 50 64 2E 65 07 00 00 00
16 49 44 41 54 08 FFFFFFFFFFFFFFD7 63 60 60 60 FFFFFFFFFFFFFFF8 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 3F FFFFFFFFFFFFFF94
44 FFFFFFFFFFFFFFB0 20 00 FFFFFFFFFFFFFFBB 0C 00 6D FFFFFFFFFFFFFFE2 17 FFFFFFFFFFFFFFE9 04 48 FFFFFFFFFFFFFFF4 FFFFFFFFFFFFFF9A 00
00 00 00 49 45 4E 44 FFFFFFFFFFFFFFAE 42 60 FFFFFFFFFFFFFF82
test.png
test.png (173 Bytes) 4751 mal betrachtet
Mein Code:

Code: Alles auswählen

void
MainWindow::readHEX(){
    ui->textBrowser->clear();
    int lineNum = 0x00;
    QString buff, filename = QFileDialog::getOpenFileName(this);
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->textBrowser->setText(tr("Error no Input"));
        return;
    }
    while (!file.atEnd()) {
            QByteArray line = file.read(16);
            for(int i=0; i != line.length(); i++){
                buff.append(makeItHex((int)line[i]) + " ");
                //ui->textBrowser_2->insertPlainText((QChar)line[i]);
            }
            ui->textBrowser->append(buff + '\n');
            buff.clear();
            lineNum += 16;
    }
}

QString
MainWindow::makeItHex(int dez){
    QString hex = QString::number(dez, 16);
    if (hex.length() < 2) hex.insert(0, "0");
    return hex.toUpper();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Problem mit Binärdaten

Beitrag von Christian81 »

QByteArray.data() bringt ein signed char * zurück und alles größer 127 ist also negativ. Wenn du das in ein Integer wandelst ist es weiterhin negativ. Also wird alles korrekt ausgegeben. Wenn Du es als unsigned char ausgeben willst dann solltest Du die Daten erst nach unsigned char casten -> C++ Grundlagen.
Abgesehen davon bringt QByteArray schon eine schöne Funktion mit die Dir die Daten hexadezimal ausgibt - Doku!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Re: Problem mit Binärdaten

Beitrag von upsala »

Du wandelst einen char in einen int. Die Zahlen 0-127 funktionieren. 128-255 funktionieren nicht. Oder ist das vielleicht -1 - -128? Denk mal darüber nach, dann kommst du selbst auf deinen Fehler.
chom
Beiträge: 24
Registriert: 13. Januar 2012 20:02

Re: Problem mit Binärdaten

Beitrag von chom »

OMG das ich nicht lache, wieder mal die eigene Dummheit von mir...
Danke an euch :D Das ich nicht selber drauf gekommen bin ist schon irgendwie dumm von mir.
Ein einfacher

Code: Alles auswählen

(unsigned char)
Cast vor das

Code: Alles auswählen

line[i]
und schon klappt es oO

Noch mal Danke an euch :D
MfG
Antworten