(gelöst) QByteArray nach Flieskomma IEEE 754

Alles rund um die Programmierung mit Qt
Antworten
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

(gelöst) QByteArray nach Flieskomma IEEE 754

Beitrag 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
Zuletzt geändert von huckleberry am 17. April 2011 14:41, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Wann funktioniert sie denn nicht?
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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);
Dateianhänge
screen.png
screen.png (21.02 KiB) 3169 mal betrachtet
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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");
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Steht ja auch nirgends dass es gehen soll - so what?
Qt bietet das nicht an also selbst programmieren...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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!
Antworten