[gelöst] Pointer von QByteArray Element umcasten

Du bist neu in der Welt von C++? Dann schau hier herein!
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

[gelöst] Pointer von QByteArray Element umcasten

Beitrag von gooze »

Hallo Forum,

Ich habe folgende Ausgangssituation:

Code: Alles auswählen

void MainWindow::openFile(){
    unsigned int *ptr;
    unsigned int test;
    QString fileName;
    QByteArray data;
    //fileName = QFileDialog::getOpenFileName(this,tr("Datei öffnen"),"","Alle Dateien (*.*)");
    fileName = tr("E:/TAB.DAT");
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    data = file.readAll();
    ui->lineEdit->setText(QString::number(data[0]));
    ui->lineEdit_2->setText(QString::number(data[7]));
    ptr = (unsigned int*)(data.data()+8);
    test = *ptr;
    ui->lineEdit_3->setText(QString::number(test));
}
Das File E:\TAB.DAT beinhaltet den folgenden Datenauszug (Hex).

Code: Alles auswählen

01 00 00 00 00 00 00 64 00 00 03 E8 00 00 00 64
Ich kenne es vom C her, dass ich durch umcasten des char* Pointers in einem Byte Array auf einen anderen pointertyp problemlos auch auf andere Datentypen als char zugreifen kann.
Das scheint im obigen Code ansatzweise auch zu funktionieren, jedoch bekomme ich als Ergebnis von *ptr
E8 03 00 00
Ich möchte aber 00 00 03 E8 herausbekommen.
Warum ist das so gedreht?
Die erste Vermutung war -> LittleEndian, aber als ich das einstellte, BigEndian ist ja laut Doc Default, half das auch nicht weiter. Der Wert blieb gleich falsch.
Als nächstes schaute ich die einzelnen Stellen im Array auf Ihren Inhalt an, vielleicht lagen die da ja schon falsch drin. Da ist aber alles richtig in der korrekten Reihenfolge.

Woraus resultiert dieser verdrehte Wert?

Danke für Eure Hilfe
gooze
Zuletzt geändert von gooze am 15. März 2009 23:03, insgesamt 1-mal geändert.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

hallo gooze,
warum machst du es dir denn so kompliziert. Du kannst dir doch auch für jeden 8 Byte Part einen eigenen ByteArray machen, den du dir mit QByteArray::mid() zurechtschneidest. So brauchst dich nicht mit Zeigern rumärgern.... ;)

Mfg androphinx

PS: Der Link zur Doku noch: http://doc.trolltech.com/4.5/qbytearray.html#mid
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

tja, ist nicht immer einfach wenn man jahrelang hardwarenah C codet.
Schön wenn es einfacher geht. Ich schau mir das mit dem mid mal an.

danke schonmal
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

ok, nun habe ich mittels mid ein 4 byte array gebaut. Und wie bekomme ich diesen 4 Byte Wert nun in einem lineEdit widget angezeigt?

durch wandeln von QByteArray in QString und anzeigen via setText geht es nicht. QByteArray::toUint habe ich auch schon probiert, aber da meckert der kompiler.
So habe ich das jetzt mal getestet:

Code: Alles auswählen

void MainWindow::openFile(){
    //unsigned int *ptr;
    //unsigned int test;
    uint test;
    QString fileName,datas;
    QByteArray data,cut;
    //fileName = QFileDialog::getOpenFileName(this,tr("Datei öffnen"),"","Alle Dateien (*.*)");
    fileName = tr("E:/MTAB.DAT");
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    data = file.readAll();
    cut = data.mid(8,4);
    test = cut.toUInt();
    ui->lineEdit->setText(QString::number(test));
    //ui->lineEdit_2->setText(QString::number((quint8)cut[1]));
    //ui->lineEdit_3->setText(QString::number((quint8)cut[2]));
    //ui->lineEdit_4->setText(QString::number((quint8)cut[3]));
    //datas.append(cut);
    //ptr = (unsigned int*)(&data[8]);
    //test = *ptr;
    //ui->lineEdit_3->setText(datas);
}
klappt nicht. Im feld lineEdit sollte der Wert 1000 also 00 00 03 E8 stehen. Der ist aber immer 0.

Was ist falsch?

gooze
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

brauchst du die zahl oder brauchst du den hex-code? wenn hex dann würde ich vorschlagen: http://doc.trolltech.com/4.5/qbytearray.html#toHex

Mfg androphinx

EDIT: was meckert der compiler bei toUint() ???
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

Na das meckern war mein fault. da habe ich die übergabeparameter falsch gewählt.

Ich brauche dec.

Code: Alles auswählen

void MainWindow::openFile(){
    //unsigned int *ptr;
    //unsigned int test;
    bool ok;
    ok = true;
    uint test;
    QString fileName,datas;
    QByteArray data,cut;
    //fileName = QFileDialog::getOpenFileName(this,tr("Datei öffnen"),"","Alle Dateien (*.*)");
    fileName = tr("E:/MTAB.DAT");
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    data = file.readAll();
    cut = data.mid(8,4);
    test = cut.toUInt(&ok,10);
    ui->lineEdit->setText(QString::number(test));
}
Das sollte doch eigentlich funktionieren. Den cut Teil mittels toUINT in ein uint wert wandeln und dann anzeigen. Aber es klappt nicht. Anstatt 1000 ist der Wert von test immer 0.
Ich verstehe das nicht!

gooze
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

toUInt liefert mir laut debug false zurück. Also hat die conversion nicht funktioniert. Warum schlägt die denn fehl?

gooze
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

ich verstehe es gerade auch ni.... was kommt'n nach dem mid() raus?

Mfg androphinx
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

nach dem mid schmeisst der Debugger

Code: Alles auswählen

"\0\0\3\e8"
für das neue QByteArray cut raus.

Ist der Wert den ich haben will. Aber das toUINT schlägt mit false fehl.

gooze
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

ist das nicht falsch? lass ihn dir mal per qDebug ausgeben. wenn ich mich nicht irre ist "\0" das gute alte ende-zeichen eines array's oder und damit wäre der array empty und damit ni in eine zahl umzuwandeln....

Mfg androphinx
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

das mit dem 0 habe ich auch schon gedacht.
Wie bereits geschildert. Die Zahl ist hier 00 00 03 E8, könnte aber auch 12 34 03 E8 heissen. Also 00 Byte sind die Regel.
Gehe ich richtig in der Annahme, dass ein QByteArray dann gar nicht für eine RAW Bearbeitung von Datenfolgen geignet ist?
Aber wie kann ich denn solche raw daten eines files effektiv bearbeiten?
Ich hatte das mit QDataStream schon mal probiert, und da hatte ich genau das gleiche Problem mit den vertauschten Bytes.
Ausserdem habe ich hier irgendwo gelesen dass der stream in QT mit vorsicht zu geniessen ist. performance byte order etc.

gooze
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

.....aber, ich habe das mid nun so modifiziert dass das neue QByteArray nur "/3/e8" enthält. Und da geht es auch nicht mit.
toUINT liefert immer noch ein false zurück.

gooze
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

und was genau sollte "toUInt()" eurer Meinung nach tun? Selbstverständlich kann das nur mit Strings funktionieren... Aber die Umwandlung von 4 Bytes in einen UInt ist keine Hexerei..:

Code: Alles auswählen

  QByteArray arr;
  arr.append((char)232);
  arr.append((char)3);
  arr.append((char)0);
  arr.append((char)0);
  unsigned value = (unsigned char)arr[0] +
                   (unsigned char)arr[1] * 256 +
                   (unsigned char)arr[2] * 256 * 256+
                   (unsigned char)arr[3] * 256 * 256 * 256;
  qDebug() << value; // 1000
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

ich würde das fast die beste variante nennen, danke solarix. ich weiß übrigens was unser denkfehler war: toUint() wandelt eine Zahl in einem String (z. B. "19243" und nicht "ahrjd") in einen uint um. Mit irgendwelchen Folgen funktioniert das natürlich nicht...

Mfg androphinx
gooze
Beiträge: 24
Registriert: 2. März 2009 09:49

Beitrag von gooze »

@androphinx
ja das es nur mit strings im qarray funktioniert habe ich nun auch festgestellt. Ist aber definitiv nicht das was ich brauche.

@solarix
elegant würde ich die Lösung aber nicht nennen. 6 Multiplikationen für einen Wert uaahhh.
Ich dachte es ist einfacher mithilfe der QT Datentypen ähnliches wie ich es vom C her kenne zu realisieren.
Ich probier das Ganze nun nochmal mit QList oder QVector. Wenn das auch nicht so recht klappt dann werde ich wieder ein normales Standard Array nutzen.
Aber eigentlich lautete meine Frage ja ganz anders.
Und zwar warum wird der Wert den ich ausgegeben bekomme in der Byte Order so vertauscht.

gooze
Antworten