Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
4 Byte in eine Float umwandeln gemäß IEEE 754
Eystorhaf
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

4 Byte in eine Float umwandeln gemäß IEEE 754

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Eystorhaf am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3988

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
Eystorhaf
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Eystorhaf am .
private Nachricht | Beiträge des Benutzers
Console32
myCSharp.de - Member



Dabei seit:
Beiträge: 266

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Console32
myCSharp.de - Member



Dabei seit:
Beiträge: 266

beantworten | zitieren | melden

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..
private Nachricht | Beiträge des Benutzers
Eystorhaf
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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....
private Nachricht | Beiträge des Benutzers
Console32
myCSharp.de - Member



Dabei seit:
Beiträge: 266

beantworten | zitieren | melden

Zitat von Eystorhaf
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/
private Nachricht | Beiträge des Benutzers
DerKleineTomy
myCSharp.de - Member



Dabei seit:
Beiträge: 106

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DerKleineTomy am .
private Nachricht | Beiträge des Benutzers