Laden...

4 Byte in eine Float umwandeln gemäß IEEE 754

Erstellt von Eystorhaf vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.500 Views
E
Eystorhaf Themenstarter:in
3 Beiträge seit 2013
vor 11 Jahren
4 Byte in eine Float umwandeln gemäß IEEE 754

Hallo

Ich habe folgendes Problem:

Ich erhalte folgende Daten von einer Schnittstelle:

byte[] IstTemp = { 8, 3, 4, 78, 99, 66, 19, 245, 104 }

Von hier sollen die vier byte IstTemp[3], IstTemp[4], IstTemp[5], IstTemp[6],
in eine float umgewandelt werden, gemäß IEEE754

Dazu bringe ich die Betreffenden bytes in die richtige Reihenfolge gemäß IEEE 754:

byte[] temp = { IstTemp[6], IstTemp[5], IstTemp[3], IstTemp[4] };

und dieses Array will ich dann in eine float umwandeln:

float temperatur = BitConverter.ToSingle(temp,0);

Werte ich obiges entsprechend aus erhalte ich als Ergebnis 56.98....;
Jedoch sollte ich eigentlich 36.8 erhalten!

Kann mir jemand sagen was ich falsch mache ?

Grüße und Dank!

4.931 Beiträge seit 2008
vor 11 Jahren

Hallo,

wie kommt du auf die Indexreihenfolge 6, 7, 4, 5?
M.E. entweder 4, 5, 6, 7 (Big Endian) oder 7, 6, 5, 4 (Little Endian).

E
Eystorhaf Themenstarter:in
3 Beiträge seit 2013
vor 11 Jahren

Ja das is mir auch gerade aufgefallen, hatte mich vertippt!

Es soll 5,6,3,4 sein!
Liegt daran das die Reihenfolge vom ModBUs an der Geräteschnittstelle vertauscht wird.

C
258 Beiträge seit 2011
vor 11 Jahren

eigentlich nichts, ich bekomme meine float als String mit Hexzeichen, sieht ähnlich aus:

                    uint floatAsInteger = uint.Parse(value.hexString, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
                    byte[] floatAsBytes = BitConverter.GetBytes(floatAsInteger);
                    return BitConverter.ToSingle(floatAsBytes, 0);

und funktioniert einwandfrei, muss an deiner Reihenfolge liegen.

C
258 Beiträge seit 2011
vor 11 Jahren

Bzw deine bytes sind falsch, laut IEEE 754 ist 36,8 als bytes:
0x421B3333 als hex bzw
66, 27, 51, 51 oder in verkehrter Reihenfolge..

E
Eystorhaf Themenstarter:in
3 Beiträge seit 2013
vor 11 Jahren

werte ich meine 4 bytes mit http://www.h-schmidt.net/FloatConverter/IEEE754.html
in meiner Reihenfolge aus:

Bytes: 5, 6, 3, 4
66, 19, 78, 99
Hex 42, 13, 48, 63

Ergibt sich: 36.82069

Ich verstehe einfach nicht wo bei mir der Denkfehler ist....

C
258 Beiträge seit 2011
vor 11 Jahren

Bytes: 5, 6, 3, 4
66, 19, 78, 99
Hex 42, 13, 48, 63

Also bei mir ist 66, 19, 78, 99
als hex: 0x42134E63.
mit folgendem Code:


                float test = BitConverter.ToSingle(new byte[] {99,78,19,66}, 0);

bekomme ich: 36.82655

genau wie mit diesem Converter http://gregstoll.dyndns.org/~gregstoll/floattohex/

D
96 Beiträge seit 2012
vor 11 Jahren

Geb ich den Hexcode auf der von dir geposteten Seite ein, erhalte ich die folgenden Bytes: 66, 19, 72, 99

Scheint mir also so, als ob du ein Fehler beim Ablesen gemacht hast.

Edit: Scheint wohl doch nur ein Fehler bei dem Hexcode gewesen zu sein. Die von dir angegebenen Bytes ergeben laut der Seite tatsächlich dein gewolltes Ergebnis, jedoch einen anderen Hexcode.