Seite 1 von 1

(gelöst) QByteArray nach Flieskomma IEEE 754

Verfasst: 14. April 2011 15:28
von huckleberry
Hallo Foristen,

ich habe einE Datenstruktur QByteArray in welchem byteweise Fliesskomma Daten (IEEE 754) abgelegt sind. 4Byte float oder 8Byte double.

Diese würde ich gerne nach float casten oder irgenwie effektiv umwandeln.

)ie Methode QByteArray::toFloat funktioniert nur bei bspw. "15.681" richtig.

Da gibts doch bestimmt eine effektive Möglichkeit?

Vielen Dank
huck

Verfasst: 14. April 2011 16:08
von upsala
Probiers mal damit:

Code: Alles auswählen

union {
  struct {
    char c1;
    char c2;
    char c3;
    char c4;
  }
  float f;
}
c1-c4 auffüllen und f auslesen.

Verfasst: 15. April 2011 14:13
von kater
Wann funktioniert sie denn nicht?

Verfasst: 16. April 2011 14:24
von huckleberry
upsala hat geschrieben:Probiers mal damit...
Sieht vielversprechend aus. hier mal Ausschnitt für 8Byte aus der Header:
Habe

Code: Alles auswählen

    struct qba_double{
        char c1;
        char c2;
        char c3;
        char c4;
        char c5;
        char c6;
        char c7;
        char c8;
    };

    union Byte2Double{
        qba_double b2d_b;
        double b2d_d;
    };
Dann die cpp:
QDate * DrawNumber::convertDelphi2Qt(QByteArray inQBA){
// QByteArray retQBA = inQBA.mid(0, 8);
// QByteArray retQBA = QByteArray::fromHex("40D3E4C000000000");

QByteArray retQBA = QByteArray::fromHex("40D3E4C000000000");

Byte2Double tt;
tt.b2d_b.c1 = retQBA.at(0);
tt.b2d_b.c2 = retQBA.at(1);
tt.b2d_b.c3 = retQBA.at(2);
tt.b2d_b.c4 = retQBA.at(3);
tt.b2d_b.c5 = retQBA.at(4);
tt.b2d_b.c6 = retQBA.at(5);
tt.b2d_b.c7 = retQBA.at(6);
tt.b2d_b.c8 = retQBA.at(7);

double g = tt.b2d_d;

int iyear = 1899 + (g/356);

QDate *rQD = new QDate(iyear, 0, 0);
rQD->addDays((int)g);
return rQD;
}
Gibt Fehlermeldung. Es wird versucht auf einen Speicherbvereich zuzugreifen, wo keine Erlaubnis besteht. Im konstruktor habe ich folgendes:

Code: Alles auswählen

    this->dQDate = new QDate();
    this->dQDate = convertDelphi2Qt(qba);

Verfasst: 16. April 2011 14:33
von huckleberry
kater hat geschrieben:Wann funktioniert sie denn nicht?
ich habe immer solche 8er ByteArrays in welchem eine Fliesskommazahl nach IEEE 754 kodiert ist. Folgendes geht zB nicht:

Code: Alles auswählen

QByteArray t = QByteArray::toFloat("D3EF4401010101EE");

Verfasst: 16. April 2011 14:44
von Christian81
Steht ja auch nirgends dass es gehen soll - so what?
Qt bietet das nicht an also selbst programmieren...

Verfasst: 17. April 2011 14:09
von huckleberry
Christian81 hat geschrieben:Steht ja auch nirgends dass es gehen soll - so what?
Ich kenne nicht alle Bibliotheken auswendig.

Nevertheless, großen Dank an upsala für die konstruktive Antwort. Es funzt!